Расходящаяся единица наименьшей точности std::atan2C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Расходящаяся единица наименьшей точности std::atan2

Сообщение Anonymous »

Я пишу кроссплатформенную программу для Windows и Linux, и мне хотелось бы, чтобы она вела себя как можно более одинаково на обеих платформах. Я использую в программе немного математики, например. std::atan2, и я заметил, что для одних и тех же входных значений иногда результат расходится в единицах наименьшей точности в зависимости от платформы или настроек оптимизации.
Рассмотрим этот сокращенный пример:

Код: Выделить всё

#include 
#include 
#include 

int main() {
// 0 0.14189707 3e114d77 with GCC on Linux
// 0 0.14189705 3e114d76 with MSVC (and compile-time evaluation in GCC)
std::print( "{} {} {:x}", std::fegetround(), std::atan2( 1.f, 7.f ),
std::bit_cast( std::atan2( 1.f, 7.f ) ) );
}
Онлайн-демо. Хотя разница между результатами невелика, она усиливается следующими вычислениями в моей программе, поэтому я хотел бы полностью избежать разницы.
Допускаются ли реализации таким образом, чтобы они расходились при одинаковом режиме округления? Существуют ли флаги компилятора для устранения или минимизации расхождений?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -precision
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»