Расходящаяся единица наименьшей точности 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

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