Search code examples
language-agnosticfloating-pointieee-754

Why does division by zero in IEEE754 standard results in Infinite value?


I'm just curious, why in IEEE-754 any non zero float number divided by zero results in infinite value? It's a nonsense from the mathematical perspective. So I think that correct result for this operation is NaN.

Function f(x) = 1/x is not defined when x=0, if x is a real number. For example, function sqrt is not defined for any negative number and sqrt(-1.0f) if IEEE-754 produces a NaN value. But 1.0f/0 is Inf.

But for some reason this is not the case in IEEE-754. There must be a reason for this, maybe some optimization or compatibility reasons.

So what's the point?


Solution

  • It's a nonsense from the mathematical perspective.

    Yes. No. Sort of.

    The thing is: Floating-point numbers are approximations. You want to use a wide range of exponents and a limited number of digits and get results which are not completely wrong. :)

    The idea behind IEEE-754 is that every operation could trigger "traps" which indicate possible problems. They are

    • Illegal (senseless operation like sqrt of negative number)
    • Overflow (too big)
    • Underflow (too small)
    • Division by zero (The thing you do not like)
    • Inexact (This operation may give you wrong results because you are losing precision)

    Now many people like scientists and engineers do not want to be bothered with writing trap routines. So Kahan, the inventor of IEEE-754, decided that every operation should also return a sensible default value if no trap routines exist.

    They are

    • NaN for illegal values
    • signed infinities for Overflow
    • signed zeroes for Underflow
    • NaN for indeterminate results (0/0) and infinities for (x/0 x != 0)
    • normal operation result for Inexact

    The thing is that in 99% of all cases zeroes are caused by underflow and therefore in 99% of all times Infinity is "correct" even if wrong from a mathematical perspective.