Всегда ли компиляторы округляют литералы с плавающей запятой, используя roundTiesToEven?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Всегда ли компиляторы округляют литералы с плавающей запятой, используя roundTiesToEven?

Сообщение Anonymous »

У меня есть следующие утверждения, которые передаются GCC, Clang и MSVC для цели x86_64:

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

// round to nearest
static_assert(0.1f == 0.100000001490116119385f);
// ties to even
static_assert(1.000000059604644775390625f == 1.f);
// if that is not possible, increase magnitude
static_assert(2097152.25f == 2097152.3f);
// flush tiny values to zero
static_assert(0e-1000f == 0);
Очевидно, что все основные компиляторы используют режим округления roundTiesToEven, как указано в ISO/IEC 60559 или IEEE-754.
Однако такое округление не гарантируется стандартом;
[lex.fcon] параграф 3 гласит, что значение литерала с плавающей запятой равно
"большему или меньшему представимому значению, ближайшему к масштабированное значение, выбранное способом, определяемым реализацией".
Ни одно из этих утверждений не требуется для прохождения.
Существуют ли какие-либо компиляторы или цели компилятора, в которых округление не выполняется с помощью roundTiesToEven?
Я подозреваю, что этот режим округления используется повсеместно, даже если он не гарантирован стандартом.

Для справки, roundTiesToEven работает следующим образом, в соответствии с ISO/IEC 60559:

должно быть
доставлено число с плавающей запятой, ближайшее к бесконечно точному результату; если два ближайших числа с плавающей запятой, заключающие в скобки непредставимый бесконечно
точный результат, одинаково близки, то должно быть доставлено число с четной младшей цифрой; если
это невозможно, должен быть доставлен тот, который больше по величине


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

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

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

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

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

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