Bug #31236 | Inconsistent division by zero behavior for floating point numbers | ||
---|---|---|---|
Submitted: | 27 Sep 2007 12:49 | Modified: | 15 Mar 2008 22:37 |
Reporter: | Sven Sandberg | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S3 (Non-critical) |
Version: | 5.1 | OS: | Any |
Assigned to: | Alexey Kopytov | CPU Architecture: | Any |
Tags: | division by zero |
[27 Sep 2007 12:49]
Sven Sandberg
[27 Sep 2007 18:05]
Valeriy Kravchuk
Thank you for a problem report. Please, check with a newer 5.1.x versions, 5.1.21, for example. It looks more consistent.
[4 Oct 2007 9:34]
Sven Sandberg
I verified the behavior with version 5.1.23.
[28 Oct 2007 14:04]
Valeriy Kravchuk
You got exactly the same results as reportered initially with 5.1.23? Strange, 5.1.21 gave me different results.
[28 Oct 2007 15:29]
Sven Sandberg
What results did you get? On what platform? Our code does not handle overflow correctly (see, e.g., Item_func_div::real_op() in sql/item_func.cc, where it only checks if the divisor is equal to 0.0). When you divide a large number by a small number such that the result overflows, the result is platform-dependent. So, it is plausible that you got other results because you are on another platform. I ran under Linux on i686.
[28 Oct 2007 17:17]
Rayson Ho
One possible fix is to do the division, and then verify the result. double Item_func_div::real_op() { ... double result = value/val2; /* the division did not cause any problem, just return the result */ if (isnormal(result)) return result; /* the result can be infinite, NaN, etc */ /* handle error cases here, check result with isfinite(3), isnan(3), etc */ ... ... return 0.0; }
[30 Oct 2007 13:04]
Sveta Smirnova
Thank you for the report. Verified as described.
[10 Feb 2008 15:56]
Alexey Kopytov
According to http://dev.mysql.com/doc/refman/5.1/en/arithmetic-functions.html "Division by zero produces a NULL result". Note that the type of the result of division depends on the types of the arguments, e.g. the result of SELECT 1.0/0 is DECIMAL, not DOUBLE. Since no numeric data type except FLOAT/DOUBLE has special "non-number" values, NULL is the only possible result of division by zero. Changing Item_func_div::real_op() to return "Inf" in this case would make the behavior inconsistent with all other numeric types. Changing the status to "Not a bug".
[11 Feb 2008 18:02]
Alexey Kopytov
Sorry, I misread the problem description. The inconsistency is that some operations with floating point numbers return NULL in case of overflow, while the other ones return inf/nan.
[19 Feb 2008 21:34]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/42598 ChangeSet@1.2659, 2008-02-20 00:33:43+03:00, kaa@kaamos.(none) +11 -0 Fix for bug #31236: Inconsistent division by zero behavior for floating point numbers Some math functions did not check if the result is a valid number (i.e. neither of +-inf or nan). Fixed by validating the result where necessary and returning NULL in case of invalid result.
[20 Feb 2008 9:28]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/42622 ChangeSet@1.2582, 2008-02-20 12:28:44+03:00, kaa@kaamos.(none) +2 -0 6.0-specific fixes for bug#31236. Fixed a test case that relied on the old math functions behavior.
[13 Mar 2008 19:29]
Bugs System
Pushed into 6.0.5-alpha
[13 Mar 2008 19:36]
Bugs System
Pushed into 5.1.24-rc
[14 Mar 2008 22:04]
Jon Stephens
Documented in the 5.1.24 and 6.0.5 changelogs as follows: Division-by-zero errors involving floating-point values were not handled consistently by all math functions. Now such functions return NULL whenever a division by zero is attempted.
[15 Mar 2008 18:54]
Alexey Kopytov
The changelog entry is inaccurate. The patch for this bug affects not just division, but also the following operators and functions when floating point numbers are involved: "-", "*", "/", POW(), EXP(). Previously they could return "+-inf" or "nan" in case of numeric overflow or invalid arguments. Now NULL is returned in such cases.
[15 Mar 2008 22:37]
Jon Stephens
Updated changelog entry to read: The -, *, and / operators and the functions POW() and EXP() could misbehave when used with floating-point numbers. Previously they might return +INF, -INF, or NaN in cases of numeric overflow (including that caused by division by zero) or when invalid arguments were used. Now NULL is returned in all such cases.
[30 Mar 2008 20:02]
Jon Stephens
Fix also noted in the 5.1.23-ndb-6.3.11 changelog.