Проблема вычисления сфинкса с большими числами

Я связал клиент 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)
Другие вопросы по тегам