Код: Выделить всё
// round to nearest
static_assert(0.1f == 0.100000001490116119385f);
// ties to even
static_assert(1.000000059604644775390625f == 1.f);
// flush tiny values to zero
static_assert(1e-1000f == 0);
Однако такое округление не гарантируется стандартом;
[lex.fcon] параграф 3 гласит, что значение литерала с плавающей запятой равно
"большему или меньшему представимому значению, ближайшему к масштабированное значение, выбранное способом, определяемым реализацией".
Ни одно из этих утверждений не требуется для прохождения.
Существуют ли какие-либо компиляторы или цели компилятора, в которых округление не выполняется с помощью roundTiesToEven?
Я подозреваю, что этот режим округления используется повсеместно, даже если он не гарантирован стандартом.
Для справки, roundTiesToEven работает следующим образом, в соответствии с ISO/IEC 60559:
должно быть
доставлено число с плавающей запятой, ближайшее к бесконечно точному результату; если два ближайших числа с плавающей запятой, заключающие в скобки непредставимый бесконечно
точный результат, одинаково близки, то должно быть доставлено число с четной младшей цифрой; если
это невозможно, должен быть доставлен тот, который больше по величине
Подробнее здесь: https://stackoverflow.com/questions/799 ... tiestoeven
Мобильная версия