Проблема вычисления сфинкса с большими числами
Я связал клиент MySQL с сервером Sphinx, когда я выдаю этот запрос
select 20130919.0+(15/4),15/4 from [INDEX] limit 1;
Я получаю следующий результат
+------+--------+-------------------+----------+
| id | weight | 20130919.0+(15/4) | 15/4 |
+------+--------+-------------------+----------+
| 7414 | 1 | 20130924.000000 | 3.750000 |
+------+--------+-------------------+----------+
Обратите внимание, что 15/4
возвращает 3.75, но когда он добавлен в 20130919.0
это возвращает неправильный результат.
в другом случае, когда я пишу следующий запрос
select 2222+15/4,15/4 from [INDEX] limit 1;
Возвращает правильный результат.
+------+--------+-------------+----------+
| id | weight | 2222+15/4 | 15/4 |
+------+--------+-------------+----------+
| 7414 | 1 | 2225.750000 | 3.750000 |
+------+--------+-------------+----------+
аналогично в предыдущем случае третий столбец должен иметь значение 20130922.75
, Я думал, что проблема в том, что сфинкс возвращает округленное число, но в этом случае это должно было быть 20130923.000
не 20130924.000
,
Я хочу, чтобы он возвращал правильное число с плавающей точкой, но действует странно. Надеюсь, у кого-то здесь есть какое-либо объяснение этому поведению.
1 ответ
Сфинкс в основном выполняет математические вычисления с плавающей запятой
http://en.wikipedia.org/wiki/Single-precision_floating-point_format
который использует только 8 бит для показателя степени. Количество десятичных цифр, которое может быть сохранено точно, составляет приблизительно 7 - у вас есть 8.
Есть функция double(), но я ее не проверял.
Изменить: на самом деле нет, double() не поможет.
sphinxQL>select double(20130919.0)+(15/4),15/4 from sample2 limit 1;
+---------------------------+----------+
| double(20130919.0)+(15/4) | 15/4 |
+---------------------------+----------+
| 20130924.000000 | 3.750000 |
+---------------------------+----------+
1 row in set (0.03 sec)
sphinxQL>select double(20130919.0+(15/4)),15/4 from sample2 limit 1;
+---------------------------+----------+
| double(20130919.0+(15/4)) | 15/4 |
+---------------------------+----------+
| 20130924.000000 | 3.750000 |
+---------------------------+----------+
1 row in set (0.02 sec)