Spec-Zone.ru › MariaDB

Точность чисел с плавающей точкой

По своей природе не все числа с плавающей точкой могут храниться с точной точностью. Архитектура оборудования, процессор или даже версия компилятора и уровень оптимизации могут повлиять на точность.

Если вы сравниваете DOUBLE или FLOAT с десятичными числами, не безопасно использовать оператор равенства.

Иногда изменение числа с плавающей точкой из одинарной точности (FLOAT) в двойную точность (DOUBLE) решит проблему.

Пример

f1, f2 и f3 кажутся идентичными по значениям в каждой строке, но из-за точности чисел с плавающей точкой результаты могут быть неожиданными.

CREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3));
INSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1);

SELECT * FROM fpn WHERE f1*f1 = f2*f2;
+------+------+------+-------+
| id   | f1   | f2   | f3    |
+------+------+------+-------+
|    1 |    2 |    2 | 2.000 |
+------+------+------+-------+

Причина, по которой была возвращена только одна строка вместо двух, становится понятной, когда мы видим, как были вычислены квадраты чисел с плавающей точкой.

SELECT f1*f1, f2*f2, f3*f3 FROM fpn;
+----------------------+----------------------+----------+
| f1*f1                | f2*f2                | f3*f3    |
+----------------------+----------------------+----------+
|                    4 |                    4 | 4.000000 |
| 0.010000000298023226 | 0.010000000000000002 | 0.010000 |
+----------------------+----------------------+----------+
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительной проверки MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/floating-point-accuracy/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API