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