Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do int and decimal throw DivideByZeroException but floating point doesn't?

According to http://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx only Int and Decimal will throw the DivideByZeroException when you divide them by 0, but when you divide floating point by 0, the result is infinity, negative infinity, or NaN. Why is this? And what are some examples where the result is +ve infinity, -ve infinity, or NaN?

like image 489
user2261573 Avatar asked Sep 15 '13 04:09

user2261573


People also ask

What happens if you divide 0 by 0 in Java?

Any number divided by zero gives the answer “equal to infinity.” Unfortunately, no data structure in the world of programming can store an infinite amount of data. Hence, if any number is divided by zero, we get the arithmetic exception .

What does floating point division by zero mean?

Floating point error means that there is a division by a zero value in your code. It can be a variable, input, or a function in use that returns zero value. You need to identify this variable/input/function and make sure that the returned value is not zero.

What is the result of dividing one floating point number by zero?

Floating-point expressions with division by zero produce one of three special values: Infinity , -Infinity , and NaN (“Not a Number”), as follows: If the dividend is nonzero and it has the same sign as the zero divisor (floating-point arithmetic distinguishes positive and negative zero), you get Infinity .


2 Answers

The IEEE standards committee felt that exception handling was more trouble than it was worth, for the range of code that could encounter these kinds of issues with floating-point math:

Traps can be used to stop a program, but unrecoverable situations are extremely rare.
[...]
Flags offer both predictable control flow and speed. Their use requires the programmer be aware of exceptional conditions, but flag stickiness allows programmers to delay handling exceptional conditions until necessary.

This may seem strange to a developer accustomed to a language in which exception handling is deeply baked, like C#. The developers of the IEEE 754 standard are thinking about a broader range of implementations (embedded systems, for instance), where such facilities aren't available, or aren't desirable.

like image 115
Michael Petrotta Avatar answered Sep 19 '22 22:09

Michael Petrotta


Michael's answer is of course correct. Here's another way to look at it.

Integers are exact. When you divide seven by three in integers you are actually asking the question "how many times can I subtract three from seven before I'd have to go into negative numbers?". Division by zero is undefined because there is no number of times you can subtract zero from seven to get something negative.

Floats are by their nature inexact. They have a certain amount of precision and you are best to assume that the "real" quantity is somewhere between the given float and a float near it. Moreover, floats usually represent physical quantities, and those have measurement error far larger than the representation error. I think of a float as a fuzzy smeared-out region surrounding a point.

So when you divide seven by zero in floats, think of it as dividing some number reasonably close to seven by some number reasonably close to zero. Clearly a number reasonably close to zero can make the quotient arbitrarily large! And therefore this is signaled to you by giving infinity as the answer; this means that the answer could be arbitrarily large, depending on where the true value actually lies.

like image 37
Eric Lippert Avatar answered Sep 22 '22 22:09

Eric Lippert