Is there anything in the C++ standard (or the IEEE 754 floating-point standard) that guarantees that 1./std::numeric_limits<double>::infinity()
is zero (or at least a small number)?

- 30,738
- 21
- 105
- 131

- 14,652
- 2
- 44
- 75
-
Look into http://floating-point-gui.de/ – Basile Starynkevitch Aug 25 '18 at 09:27
-
[Very related](https://stackoverflow.com/questions/29426734/is-0-divided-by-infinity-guaranteed-to-be-0). – user202729 Aug 25 '18 at 14:46
4 Answers
Any finite number divided by infinity results in zero under IEEE 754 (and therefore the same in most typical C++ implementations).
If the sign of the of numerator and denominator differ, the result will be negative zero, which is equal to zero.

- 239,568
- 38
- 324
- 436
-
3Uhm, no, not exactly: if the finite number is negative it returns -0, which is not the same thing as 0 (although it compares equal). – Federico Poloni Aug 25 '18 at 12:31
-
6
-
2@FedericoPoloni: Both +0 and −0 in IEEE 754 specification level 2 (floating-point data) represent zero in level 1 (extended real numbers). – Eric Postpischil Aug 25 '18 at 17:46
Yes, according to the GNU C library reference manual (assuming IEEE 754):
Infinities propagate through calculations as one would expect: for example, 2 + ∞ = ∞, 4/∞ = 0
https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
You may want to check if your C++ compiler uses IEEE 754:
How to check if C++ compiler uses IEEE 754 floating point standard

- 30,738
- 21
- 105
- 131

- 5,576
- 1
- 29
- 60
IEEE 754-2008 6.1 says:
The behavior of infinity in floating-point arithmetic is derived from the limiting cases of real arithmetic with operands of arbitrarily large magnitude, when such a limit exists. Infinities shall be interpreted in the affine sense, that is: −∞ < {every finite number} < +∞.
Operations on infinite operands are usually exact and therefore signal no exceptions,…
Since the limit of 1/x as x increases without bound is zero, a consequence of this clause is that 1/∞ is zero.
Clause 6.3 tells us the sign of the result is +:
When neither the inputs nor result are NaN, the sign of a product or quotient is the exclusive OR of the operands’ signs;…

- 1
- 1

- 195,579
- 13
- 168
- 312
if(std::numeric_limits<double>::is_iec559)
yes();
else
no();
(see 18.3.2.4)
IEC 559, which is identical with IEEE 754, guarantees that to be the case. However, C++ does not guarantee in any way that IEC 559 is in place (although 99.99% of the time that's just what happens to be the case, you still need to verify to be sure).

- 67,688
- 20
- 135
- 185
-
1Since nobody is likely to bother implementing and testing non-IEEE 754 platforms, one might as well `static_assert(std::numeric_limits
::is_iec559)`. – John Zwinck Aug 26 '18 at 02:01 -
@JohnZwinck: That's actually a good point. If your code relies on IEEE 754 particulars, then it won't work if these aren't present. So `static_assert` is a very valid option (possibly, probably, even the better one). – Damon Aug 26 '18 at 12:26