Может ли быть достигнуто условие ошибки округления двойной точности? - PullRequest
0 голосов
/ 21 октября 2019

Я нашел эту строку кода в IronPython форке DLR :

return value < 0.0 || 1.0 / value < 0.0 ? -0.0 : 0.0;

Где value - это double. Контрольного примера не существует, и, поскольку 1.0 / double.MaxValue > 0 я изо всех сил пытаюсь понять, как можно достичь условия 1.0 / value < 0.0.

Есть идеи?

РЕДАКТИРОВАТЬ Я имею в виду достигнуто значимым образом, чтобы value < 0.0 == false и 1.0 / value < 0.0 == true

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Это условие, чтобы поймать случай, когда value само по себе -0.0. Он гарантирует, что метод возвращает -0.0, когда входное значение равно -0.0.

Условие -0.0 < 0.0 ложно, но 1.0 / -0.0 равно -∞, а -∞ < 0.0 истинно.

Поэтому 1.0 / value < 0.0 будет иметь значение true, когда value равно -0.0, тогда как value < 0.0 приведет к ложному.

Это подтверждается комментарием в строке над цитируемой вами строкой:

// Preserve the sign of the input, including +/-0.0
return value < 0.0 || 1.0 / value < 0.0 ? -0.0 : 0.0;

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

1 голос
/ 21 октября 2019

Будет отрицательным, если значение отрицательное.

(1 / -0.5) = -2

...