AtariSMN82
@AtariSMN82
Разработчик игр

С++ На всех ли платформах одинаковая точность операций с float?

Есть ли различия между ОС/Процессорами в работе с float в C++?
Допустим я скомпилирую программу под x32 windows и x64 arm с флагом -O2, будет ли и там и там одинаковая точность работы с float переменными, то есть будут ли одинаковые результаты при сложении/умножении чисел или использовании sqrt?
Поменяется ли ситуация, если будет -Ofast или для обоих систем будут одинаковые результаты?

Я очень не хочу расхождений в работе вычислений на разных платформах и даже готов подрубить софтверный float лишь бы всё было одинаково, мне лень гуглить по теме, может здесь кто знает ответ
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Форматы чисел с плавающей точкой стандартизованы IEEE754.
Скорее всего, операции выполняемые процессором над числами с плавающей точкой будут давать одинаковый результат на разных платформах.
Но вот программные реализации различных математических алгоритмов из стандартной библиотеки, типа того же sqrt и т.п., могут отличаться.
Для гарантии, вам нужно использовать для этих целей какую-то единую библиотеку для всех платформ, а не стандартный math.h.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@dima20155
you don't choose c++. It chooses you
Если вы пишите кросплатформенное ПО, то используйте платформонезависимые типы:
int32_t, uint16_t, float32_t и так далее (также есть чуть более хитрый unsigned тип std::size_t).

Это классический подход, которые используется много где. Даже если вы пишите ПО для 2-ух или 3-ех известных вам платформ, то будет хорошей практикой использовать подобные типы.
https://en.cppreference.com/w/cpp/header/stdfloat

float занимает 4 байта, double - 8 байт и на 32битной платформе и на 64битной:
Ответ написан
solotony
@solotony
покоряю пик Балмера
В общем ответ - нет. Нет никакой гарантии что операции с плавающей точкой посчитаются одинаково на разных архитектурах. Я на практике с этим сталкивался при решении дифуров, когда из-за проблем с точностью мы получали качествнно разный результат на разных платформах
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
Точность зависит от типов данных, которые ты используешь. float и double имеют одинаковую длину в 32бит и 64бит архитектурах.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Ну ... тут нет теоретически верного ответа. Инфо-технологии - это как физика-естествознание.
Тут надо просто взять два компиллятора и две платформы. Собрать код типа.

float x = 3.14;

и посмотреть sizeof(...)

Можно еще глянуть как выглядит число 3.14 в бинарном представлении. Сделаешь это кастингом.
И сделать выводы о стандартах хранения флоатов в данном компилляторе.

Теоретически должен быть 32х битный везде.

Но проверь!

Бывают еще double (64bit) extended (80bit),
half float (16bit не встречал в практике никогда но литература ссылается).
Ответ написан
Stalker_RED
@Stalker_RED
Я просто оставлю это здесь
https://0.30000000000000004.com/
там и про IEEE754, и про разные языки, и про длинную арифметику...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы