Является ли умножение с плавающей запятой на ноль гарантией получения нуля?
Я понимаю, что с плавающей точкой имеют ошибки округления, но мне интересно, есть ли ситуации, в которых ошибка не применяется, например умножение на ноль.
Нуль в любое время = 0 для всех плавающих точек?
Ответ 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, отличающийся от кажущегося значения double0.0 или 1.0.