Является ли инверсным значение std :: numeric_limits :: infinity() ноль?

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Операции с бесконечными операндами, как правило, точны и поэтому не содержат никаких исключений...

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

В пункте 6.3 указано, что знак результата равен +:

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

Ответ 4

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

(см. 18.3.2.4)

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