2014-12-04 3 views
4

Для столбца с большими реальными значениями 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 | 
+------------------------+ 
+3

Может быть какая-то странная проблема промежуточного значения. если вы сделаете 'select x + y + z' с вашими значениями, вы получите' ERROR 1690 (22003): значение DOUBLE находится за пределами допустимого диапазона в '((1.80309068027e307 + 1.44090607633e308) + 1.59586958712e308)' 'то же самое для' выберите сумму (...) + 0.0' –

+0

Определенно проблема переполнения. '1.7976931348623157e308' является максимальным значением для [числа двойной точности] (https://en.wikipedia.org/wiki/Double-precision_floating-point_format),' 2^1024'. –

+1

Вы не должны использовать реальный или двойной в первую очередь, если хотите получить точные результаты: http://floating-point-gui.de/ (Кстати, моя установка MySQL даже не позволяет мне вставлять эти значения: "* ОШИБКА 1264 (22003): значение вне диапазона для столбца «f_real» в строке 1 * ») –

ответ

0

Хорошо, я думаю, что это связано с ударом потолка в количестве, с которым SUM может справиться.

Например: Вставка в значения z (1.80309068027e307), (1.44090607633e307), (1.59586958712e307);

работает нормально.

Вставка в значения z (1.80309068027e308), (1.44090607633e307), (1.59586958712e307);

не работает, потому что 1.80309068027e308 является незаконным двойным. Я предполагаю, потому что он слишком большой.

Итак, кажется, что если вы суммируете цифры, которые находятся под двойным потолком, но результат в два раза выше этого потолка, он сообщает 0, а не возвращает ошибку?

 Смежные вопросы

  • Нет связанных вопросов^_^