Подтвердить что ты не робот

Является ли умножение с плавающей запятой на ноль гарантией получения нуля?

Я понимаю, что с плавающей точкой имеют ошибки округления, но мне интересно, есть ли ситуации, в которых ошибка не применяется, например умножение на ноль.

Нуль в любое время = 0 для всех плавающих точек?

4b9b3361

Ответ 1

False

0f * NAN == NAN
0f * INFINITY == NAN

и...

0f * -1f == -0f (negative 0f), with 0f == -0f :-)

(на Intel, VС++ и, возможно, на любой платформе, использующей плавающие точки IEEE 754-1985)

Пример ideone (возможно, с помощью GCC на некоторой совместимой с Intel платформе)

Ответ 2

В дополнение к @xanatos прекрасный ответ, рассмотрите некоторые из проблем, стоящих перед ОО:

Мне интересно, есть ли ситуации, в которых ошибка округления не применяется.

Кандидаты включают some_double_y = some_double_x * 1.0 и some_double_y = some_double_x + 0.0, возможно, никогда не будут иметь ошибки округления.

Тем не менее, даже подозрительные из-за того, что компилятор может оценивать double с большей точностью, учитывая FLT_EVAL_METHOD == 2, где "оценивать все операции и константы в диапазоне и точности типа long double". В этом случае промежуточный some_double_x может существовать как long double, отличающийся от кажущегося значения double 0.0 или 1.0.