|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||||||
[c++] упростить конструкцию safe_cast, преобразование типов без потерь данных10.06.2020, 23:22. Показов 2309. Ответов 28
Всем привет!
Сборка проекта на максимальных уровнях предупреждений очень часто терпит неудачу из-за предупреждений вида:
И как то не хочется тратить кучу времени на разбирательства с каждым таким случаем. Хочется просто сразу вписать static_cast, в расчете на то, что даже если источник данных имеет больший размер, чем получатель, все равно сами данные всегда будут в пределах диапазона получателя. А на случай нарушения этого джентельменского соглашения хочется иметь дополнительную страховку. Следующий код иллюстрирует сабж:
limitsНе нравится зависимость от type_traits и decltypeМне кажется можно сделать как то попроще. Как то такие вещи же делали во времена с++03, когда decltype ещё не существовало?
0
|
|||||||||||
| 10.06.2020, 23:22 | |
|
Ответы с готовыми решениями:
28
Как работает safe_cast и чем отличается от обычного приведения типов? Сжатие целочисленных данных без потерь Переход между формами без потерь данных в текстбоксах |
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||||||
| 11.06.2020, 16:50 | ||||||
|
Если вас интересует "содержимое памяти", то вам нужна реинтерпретация, а не касты. Реинтерпретацию делают memcpy, union и доcтуп через unsigned char * указатель.С реинтерпретацией данных все просто: байтов хватает - значит данные поместятся. Сравните sizeof, сделайте memcpy - и готово. Однако помните, что может получиться trap representation. Т.е. пытаться работать с float значением, полученным путем реинтерпретации int значения - это дикий бред и феерическая чушь (и да, я помню про трюк из doom).--- Перечитал ваше исходное сообщение. Вердикт: и по процитированному предупреждению компилятора, и по приведенному коду очень хорошо видно, что ни о какой "реинтерпретации" речи в вашем вопросе не идет. Ваш вопрос - именно о приведении типа, т.е. о кастах. Этот вопрос я закрыл дал в сообщении #3. Зачем вы сейчас бросились выдумывать какую-то "реинтерпретацию" - тему, к который ваш изначальный вопрос не имел никакого отношения - мне не ясно.
0
|
||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||||||
| 11.06.2020, 16:55 [ТС] | ||||||||||||||||
|
Можно ли записать double во float без потерь?
Первый эксперимент: Берем float, и засовываем его в double. А потом вытаскиваем обратно из double во float. Если получившееся значения пренебрежительно равно исходному, значит данное значение float можно без потерь поместить в doubleДля тестирования использовала фреймворк gtest
Подробности в исходном коде gtest. Кликните здесь для просмотра всего текста
у них там UB, кстати, в классе FloatingPoint, но всем пофигу. Результат: float можно записать в double без потерь данных.Второй экперимент: Берем double, и засовываем его во float. А потом вытаскиваем обратно. Если получившееся значения слишком сильно разнятся, значит нельзя сохранить double во float, без потерь данных
Отладчик показывает:
То есть по сути, каст из float в double приводит к искажению данных. Что на мой взгляд, ещё хуже чем потеря данных.
0
|
||||||||||||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|||
| 11.06.2020, 17:11 | |||
|
Каст из double в float приводит к искажению значения. Что ожидаемо. Каст из float в double никогда не приводит к потере значения, по крайней мере в IEEE754 представлениях.Все искажения в ваших экспериментах возникли только при касте из double в float, а не наоборот.
2
|
|||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||
| 11.06.2020, 17:29 [ТС] | ||||||
|
Ещё можно просто писать нормальный код, который не агрит компиляторы. И компиляторы, которые не должны кидать предупреждений. И к тому же, возбуждает у компиляторов предупреждение. Вы запостили код, который генерирует предупреждение в связи с потенциально небезопасным кастом. Вы отдаёте себе отчет в том, что запостили такой код в тему, которая посвящена тому, как можно избавиться от подобных предупреждений? Не находите, что это немножко глупо? В этой теме я вообще не буду рассматривать код, который агрит компиляторы. Добавлено через 3 минуты Ну видно же по эксперименту?
0
|
||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|||||
| 11.06.2020, 17:45 | |||||
|
Во-вторых, "агрит" компилятор в данном случае сама суть вашей задачи. Поэтому никакого универсального "нормального кода" тут быть не может. Пока вы не определитесь, о чем же вы ведете речь, осмысленного разговора не получится.
0
|
|||||
|
Комп_Оратор)
|
|||
| 11.06.2020, 17:58 | |||
|
биты не задействованные во флоат должны быть нулевыми. Знак не учитываю и формат считаю семантически подобным. Это учитывая факт двоичного представления - задача пикантная. Не уверен в том, что есть нетривиальный способ это проконтролировать. Хотя написать платформеннозависимую функцию выполняющую битовый анализ и возвращающую даже ошибку округления (или невозможность представления) впринципе возможно. Но это далеко от возможностей преобразования типов языка С++. Может и писал кто-то что-то подобное.
0
|
|||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|
| 11.06.2020, 17:58 | |
|
del
0
|
|
|
Комп_Оратор)
|
|
| 12.06.2020, 09:42 | |
|
Вот ещё материал, но он уже содержит пыль веков. Компиляторы стали умнее. Однако, почитать может быть интересно:
Андрей Александреску Современное проектирование на С++ гл.2.1. Статическая проверка диагностических утверждений. Тут о безопасности статических преобразований. По сути, как было сказано, компилятор и сам не даст данным умереть спокойно (сужающий вариант), но если хочется расширенной диагностической информации в то время как сообщение компилятора не устраивает, можно написать свои шаблоны. гл.2.7. Распознавание конвертируемости и наследования на этапе компиляции Это о возможности преобразований типов иерархии (указателей вернее). Разумеется, всё относится ко времени компиляции и ни как не конкурирует с RTTI.
0
|
|
| 12.06.2020, 09:42 | |
|
Преобразование типов без исчезания нуля
упростить конструкцию Упростить конструкцию Как упростить конструкцию? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|