Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2016, 15:40   #1
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
Радость PHP, тип Double - точность вычислений

Привет!
Подскажите по типу Double в PHP. Есть проблема, что так как десятичные числа хранятся не как точные, то могут быть такие ошибки при использовании мат. функций (ниже). Вопрос в том, чья это проблема при разработке. Если программист пользуется типом Дабл, как он может гарантировать, что всё будет посчитано точно. Или это принципиальный компромисс в пользу скорости и использования памяти?

Вот цитата из руководства по MySQL:

"Note that as decimal numbers are normally not stored as exact numbers in computers, but as double-precision values, you may be fooled by the following result:
mysql> SELECT TRUNCATE(10.28*100,0);
-> 1027

The above happens because 10.28 is actually stored as something like 10.2799999999999999. "

То же самое и при вычислениях на PHP.
Возникает вопрос, зачем нужен тип Дабл, если возникают такие проблемы? Может ли он гарантировать хоть какую-то точность. Или что получается, то и получается (приближённо).

Альтернатива - BCMATH.
vinniepooh вне форума Ответить с цитированием
Старый 09.01.2016, 18:48   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

А вам какая нужна точность? В любом случае всегда есть предел точности вычислений, а во время вывода просто надо округлять дробные числа до требуемого числа знаков. Ну и не пытаться пару вещественных чисел сравнивать оператором ==
Arigato вне форума Ответить с цитированием
Старый 09.01.2016, 19:07   #3
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Точность - наверное, тут главное иметь гарантированное число правильных знаков. Ведь при желании можно его увеличить. А вот если мы не знаем, точно посчитало или нет - то это дальше не используешь. Посчитали, допустим, SIN(1.34) - а не знаем, сколько правильно. Или в этом примере.

+-1 - и уже всё поехало. Вообще нужна большая точность. Гляжу в сторону BCMath. Но с Даблом хотел бы разобраться, и не только в этом языке.

В общем, главное гарантия - что конкретно этот знак результата верный. Она есть?
vinniepooh вне форума Ответить с цитированием
Старый 09.01.2016, 19:33   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И чего мало материала по этой теме?
http://floating-point-gui.de/basic/
http://php.net/manual/en/language.types.float.php
http://habrahabr.ru/post/112953/
https://rsdn.ru/article/alg/float.xml
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.01.2016, 23:06   #5
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Спасибо за ссылки. Первую я видел, просто не успел прочесть. А вот руководство PHP меня первоначально насторожило - там так написано, как будто всё настолько плохо, что результатам вообще нельзя доверять. Собственно, поэтому и начал выяснять всё. В 3-й статье оптимистично, что "арифметика почти совершенна". Что же реально на практике, выясняю.
vinniepooh вне форума Ответить с цитированием
Старый 09.01.2016, 23:31   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Если программист пользуется типом Дабл, как он может гарантировать, что всё будет посчитано точно. Или это принципиальный компромисс в пользу скорости и использования памяти?
Это не компромисс, а необходимость.
- Чем больше числа тем медленнее они обрабатываются. Железячники нашли компромисс в виде 32 и 64 бит и объявили их стандартом. Они бы могли сделать числа больше, но тогда частота процессоров бы снизилась.
- Принципиально большие числа не решают проблему. Так как у математиков числа бесконечные к примеру корень(2), а в компьютере все числа ограниченны. Поэтому ошибки будут всегда. И большие числа не делают ошибки реже, они просто происходят на других входных данных.
- Использовать числа с переменной длиной тоже не выход. Так как алгоритм удвоения длины после каждой операции приводит к тому что через 32-35 операций вся память закончиться.

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

Цитата:
В общем, главное гарантия - что конкретно этот знак результата верный. Она есть?
После каждой операции результат округляется усекается до 64 бит. Отсюда всегда будут ошибки. Так что тут либо смериться либо бороться.
А способ борьбы зависит от конкретной задачи. Это как соревнования щита и копья.

- Матрицы: оценка точности через число обусловленности; Смена алгоритма к примеру с Гаусса на SVD.
- Финансовые вычисления: делаются в СУБД с поддержкой целых чисел или с фиксированной точки.
- ЦОС: Разложение фильтра идёт на чётные степени.
- Геометрия: сравнение идёт с допуском.
- Статистика: суммирования ведут от малых чисел к большим.
- Математика: вычисление гипотенузы делают через деление.
и тд.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 10.01.2016, 17:14   #7
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Сейчас же ноутбуки и сервера довольно мощные и памяти много.
Реально вычислять на PHP с точностью 7-15 знаков промежуточные результаты, чтобы конечный результат был хорошим?
Вот возьмём сервер 4-8 GB RAM и 4-ядерный процессор. Сколько реально знаков там будет правильных у функций типа синуса и т.п.?

BCMath - хорошее расширение. 4-8 ГБ должно хватить реально, чтобы считать с приемлемой точностью.

Вот возьмём 3.787*4.39381234567 - сколько реально будет верных знаков здесь?
Также 3.787+4.39381234567, 3.787/4.39381234567 и SIN(3.787*4.39381234567).

Последний раз редактировалось vinniepooh; 10.01.2016 в 17:18.
vinniepooh вне форума Ответить с цитированием
Старый 10.01.2016, 17:38   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Зачем вам такая точность в знаках после точки? Это разве что для каких-то научных вычислений может пригодится.
Arigato вне форума Ответить с цитированием
Старый 10.01.2016, 17:44   #9
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Может и не научные, но вычисления деревянных домов. Там если обвалится, будет не до смеха...
vinniepooh вне форума Ответить с цитированием
Старый 10.01.2016, 18:22   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Может и не научные, но вычисления деревянных домов.
тю на Вас.
берите размеры в миллиметрах. тогда два знака после запятой (одна сотая миллиметра) - эта точность, которую Вам не даст НИ ОДИН строительный измерительный прибор. Посмотрите, например, допуски при строительстве, линейный допуск 1-го класса точности (самый высокий), при длинах до 20 мм составляет 0.24 мм, при больших длинах допуск увеличивается, разумеется).
А в промежуточных вычислениях используйте 8-9 знаков после запятой, чтобы гарантировать отсутствие потери точности до 5-6 знаков.
Всё. Большая точность Вам не нужна.
Как избежать потерю точности - см. пост #6

p.s. никому не нужно точность в 15 знаков после запятой в указании длины конструкции. Откройте таблицу с размерами атома. Вы удивитесь, но размер атома аллюминия, например, имеет размер 0.000000118 мм (это 9 знаков после запятой), Вам нужна большая точность, чем размер атома?! Нанотехнологии в строительстве на марше?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точность вычислений обратной матрицы методом Карамера FlaringSoul Паскаль, Turbo Pascal, PascalABC.NET 3 14.05.2013 00:21
Точность double в c++ firephenix Помощь студентам 0 25.10.2011 12:35
Точность вычислений aly-lucenko Фриланс 1 02.05.2011 21:38
Long double. Максимальная точность. juzam Общие вопросы C/C++ 2 05.10.2010 14:48
диапазон double и погрешности вычислений ilyagoo Общие вопросы C/C++ 4 13.12.2007 17:29