Для столбца с большими реальными значениями MySQL вернет 0 для своей суммы, но если он будет завершен в подзапросе, возвращается ненулевой результат. Я знаю, что обычно случаи переполнения не определены, но мне кажется странным, что MySQL будет возвращать разные результаты в зависимости от того, является ли запрос простым или содержит подзапрос.MySQL СУММЫ типа REAL могут возвращать несогласованные результаты
create table z (f_real real);
insert into z values (1.80309068027e307),(1.44090607633e308),(1.59586958712e308);
select sum(f_real) from z;
+-------------+
| sum(f_real) |
+-------------+
| 0 |
+-------------+
select * from (select sum(f_real) from z) t;
+------------------------+
| sum(f_real) |
+------------------------+
| 1.7976931348623157e308 |
+------------------------+
Может быть какая-то странная проблема промежуточного значения. если вы сделаете 'select x + y + z' с вашими значениями, вы получите' ERROR 1690 (22003): значение DOUBLE находится за пределами допустимого диапазона в '((1.80309068027e307 + 1.44090607633e308) + 1.59586958712e308)' 'то же самое для' выберите сумму (...) + 0.0' –
Определенно проблема переполнения. '1.7976931348623157e308' является максимальным значением для [числа двойной точности] (https://en.wikipedia.org/wiki/Double-precision_floating-point_format),' 2^1024'. –
Вы не должны использовать реальный или двойной в первую очередь, если хотите получить точные результаты: http://floating-point-gui.de/ (Кстати, моя установка MySQL даже не позволяет мне вставлять эти значения: "* ОШИБКА 1264 (22003): значение вне диапазона для столбца «f_real» в строке 1 * ») –