|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||||||
[c++] упростить конструкцию safe_cast, преобразование типов без потерь данных10.06.2020, 23:22. Показов 2296. Ответов 28
Всем привет!
Сборка проекта на максимальных уровнях предупреждений очень часто терпит неудачу из-за предупреждений вида:
И как то не хочется тратить кучу времени на разбирательства с каждым таким случаем. Хочется просто сразу вписать static_cast, в расчете на то, что даже если источник данных имеет больший размер, чем получатель, все равно сами данные всегда будут в пределах диапазона получателя. А на случай нарушения этого джентельменского соглашения хочется иметь дополнительную страховку. Следующий код иллюстрирует сабж:
limitsНе нравится зависимость от type_traits и decltypeМне кажется можно сделать как то попроще. Как то такие вещи же делали во времена с++03, когда decltype ещё не существовало?
0
|
|||||||||||
| 10.06.2020, 23:22 | |
|
Ответы с готовыми решениями:
28
Как работает safe_cast и чем отличается от обычного приведения типов? Сжатие целочисленных данных без потерь Переход между формами без потерь данных в текстбоксах |
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
||||||
| 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
|
||||||||||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|||
| 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
|
||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|||||
| 11.06.2020, 17:45 | |||||
|
Во-вторых, "агрит" компилятор в данном случае сама суть вашей задачи. Поэтому никакого универсального "нормального кода" тут быть не может. Пока вы не определитесь, о чем же вы ведете речь, осмысленного разговора не получится.
0
|
|||||
|
Комп_Оратор)
|
|||
| 11.06.2020, 17:58 | |||
|
биты не задействованные во флоат должны быть нулевыми. Знак не учитываю и формат считаю семантически подобным. Это учитывая факт двоичного представления - задача пикантная. Не уверен в том, что есть нетривиальный способ это проконтролировать. Хотя написать платформеннозависимую функцию выполняющую битовый анализ и возвращающую даже ошибку округления (или невозможность представления) впринципе возможно. Но это далеко от возможностей преобразования типов языка С++. Может и писал кто-то что-то подобное.
0
|
|||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,405
|
|
| 11.06.2020, 17:58 | |
|
del
0
|
|
|
Комп_Оратор)
|
|
| 12.06.2020, 09:42 | |
|
Вот ещё материал, но он уже содержит пыль веков. Компиляторы стали умнее. Однако, почитать может быть интересно:
Андрей Александреску Современное проектирование на С++ гл.2.1. Статическая проверка диагностических утверждений. Тут о безопасности статических преобразований. По сути, как было сказано, компилятор и сам не даст данным умереть спокойно (сужающий вариант), но если хочется расширенной диагностической информации в то время как сообщение компилятора не устраивает, можно написать свои шаблоны. гл.2.7. Распознавание конвертируемости и наследования на этапе компиляции Это о возможности преобразований типов иерархии (указателей вернее). Разумеется, всё относится ко времени компиляции и ни как не конкурирует с RTTI.
0
|
|
| 12.06.2020, 09:42 | |
|
Преобразование типов без исчезания нуля
упростить конструкцию Упростить конструкцию Как упростить конструкцию? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|