Является ли инверсным значение 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% времени, что именно так случается, вам все равно необходимо убедиться, чтобы убедиться).