Является ли обратное к std::numeric_limits::infinity() нулевым?

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

4 ответа

Решение

Да, согласно справочному руководству по библиотеке 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 с плавающей запятой

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

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

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

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

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

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

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

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

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

(см. 18.3.2.4)

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

Другие вопросы по тегам