Является ли обратное к std :: numeric_limits :: infinity () нулевым? - PullRequest
0 голосов
/ 25 августа 2018

Есть ли что-либо в стандарте C ++ (или стандарте IEEE 754 с плавающей точкой), которое гарантирует, что 1./std::numeric_limits<double>::infinity() равно нулю (или хотя бы небольшому числу)?

Ответы [ 4 ]

0 голосов
/ 25 августа 2018

IEEE 754-2008 6.1 гласит:

Поведение бесконечности в арифметике с плавающей точкой получается из предельных случаев реальной арифметики с операндами произвольно большой величины, когда такой предел существует.Бесконечности должны интерпретироваться в аффинном смысле, то есть: −∞ <{каждое конечное число} <+ ∞. </p>

Операции над бесконечными операндами обычно точны и, следовательно, не сигнализируют об исключениях,…

Поскольку предел 1 / x при увеличении x без ограничения равен нулю, следствием этого условия является то, что 1 / ∞ равно нулю.

Предложение6.3 говорит нам, что знак результата равен +:

Когда ни входные данные, ни результат не являются NaN, знак произведения или частного является исключительным ИЛИ знаков операндов;…

0 голосов
/ 25 августа 2018

Да, согласно справочному руководству библиотеки GNU C (при условии, что IEEE 754):

Бесконечности распространяются в вычислениях, как и следовало ожидать: например, 2 + ∞ = ∞, 4 / ∞ =0

https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

Вы можете проверить, использует ли ваш компилятор C ++ IEEE 754:

Как проверить, является ли компилятор C ++использует стандарт IEEE 754 с плавающей запятой

0 голосов
/ 25 августа 2018

if(std::numeric_limits<double>::is_iec559) yes(); else no();

(см. 18.3.2.4)

МЭК 559, идентичный IEEE 754, гарантирует, что это так.Тем не менее, C ++ никоим образом не гарантирует того, что МЭК 559 применяется (хотя в 99,99% случаев это именно то, что имеет место, вам все равно необходимо убедиться, чтобы быть уверенным).

0 голосов
/ 25 августа 2018

Любое конечное число, деленное на бесконечность, приводит к нулю в соответствии с IEEE 754 (и, следовательно, то же самое в большинстве типичных реализаций C ++).

Если знак числителя и знаменателя различен, результат будет отрицательным нулем, что равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...