|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.01.2016, 15:40 | #1 |
Форумчанин
Регистрация: 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. |
09.01.2016, 18:48 | #2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,648
|
А вам какая нужна точность? В любом случае всегда есть предел точности вычислений, а во время вывода просто надо округлять дробные числа до требуемого числа знаков. Ну и не пытаться пару вещественных чисел сравнивать оператором ==
E-Mail: arigato.freelance@gmail.com
|
09.01.2016, 19:07 | #3 |
Форумчанин
Регистрация: 11.04.2010
Сообщений: 440
|
Точность - наверное, тут главное иметь гарантированное число правильных знаков. Ведь при желании можно его увеличить. А вот если мы не знаем, точно посчитало или нет - то это дальше не используешь. Посчитали, допустим, SIN(1.34) - а не знаем, сколько правильно. Или в этом примере.
+-1 - и уже всё поехало. Вообще нужна большая точность. Гляжу в сторону BCMath. Но с Даблом хотел бы разобраться, и не только в этом языке. В общем, главное гарантия - что конкретно этот знак результата верный. Она есть? |
09.01.2016, 19:33 | #4 |
Старожил
Регистрация: 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
ЛС отключены Аларом. |
09.01.2016, 23:06 | #5 |
Форумчанин
Регистрация: 11.04.2010
Сообщений: 440
|
Спасибо за ссылки. Первую я видел, просто не успел прочесть. А вот руководство PHP меня первоначально насторожило - там так написано, как будто всё настолько плохо, что результатам вообще нельзя доверять. Собственно, поэтому и начал выяснять всё. В 3-й статье оптимистично, что "арифметика почти совершенна". Что же реально на практике, выясняю.
|
09.01.2016, 23:31 | #6 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
- Чем больше числа тем медленнее они обрабатываются. Железячники нашли компромисс в виде 32 и 64 бит и объявили их стандартом. Они бы могли сделать числа больше, но тогда частота процессоров бы снизилась. - Принципиально большие числа не решают проблему. Так как у математиков числа бесконечные к примеру корень(2), а в компьютере все числа ограниченны. Поэтому ошибки будут всегда. И большие числа не делают ошибки реже, они просто происходят на других входных данных. - Использовать числа с переменной длиной тоже не выход. Так как алгоритм удвоения длины после каждой операции приводит к тому что через 32-35 операций вся память закончиться. Вот и приходиться программистам думать как гарантировать точность. В принципе можно подобрать нужный алгоритм который гарантирует заданную точность. Цитата:
А способ борьбы зависит от конкретной задачи. Это как соревнования щита и копья. - Матрицы: оценка точности через число обусловленности; Смена алгоритма к примеру с Гаусса на SVD. - Финансовые вычисления: делаются в СУБД с поддержкой целых чисел или с фиксированной точки. - ЦОС: Разложение фильтра идёт на чётные степени. - Геометрия: сравнение идёт с допуском. - Статистика: суммирования ведут от малых чисел к большим. - Математика: вычисление гипотенузы делают через деление. и тд.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
10.01.2016, 17:14 | #7 |
Форумчанин
Регистрация: 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. |
10.01.2016, 17:38 | #8 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,648
|
Зачем вам такая точность в знаках после точки? Это разве что для каких-то научных вычислений может пригодится.
E-Mail: arigato.freelance@gmail.com
|
10.01.2016, 17:44 | #9 |
Форумчанин
Регистрация: 11.04.2010
Сообщений: 440
|
Может и не научные, но вычисления деревянных домов. Там если обвалится, будет не до смеха...
|
10.01.2016, 18:22 | #10 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
берите размеры в миллиметрах. тогда два знака после запятой (одна сотая миллиметра) - эта точность, которую Вам не даст НИ ОДИН строительный измерительный прибор. Посмотрите, например, допуски при строительстве, линейный допуск 1-го класса точности (самый высокий), при длинах до 20 мм составляет 0.24 мм, при больших длинах допуск увеличивается, разумеется). А в промежуточных вычислениях используйте 8-9 знаков после запятой, чтобы гарантировать отсутствие потери точности до 5-6 знаков. Всё. Большая точность Вам не нужна. Как избежать потерю точности - см. пост #6 p.s. никому не нужно точность в 15 знаков после запятой в указании длины конструкции. Откройте таблицу с размерами атома. Вы удивитесь, но размер атома аллюминия, например, имеет размер 0.000000118 мм (это 9 знаков после запятой), Вам нужна большая точность, чем размер атома?! Нанотехнологии в строительстве на марше?! |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Точность вычислений обратной матрицы методом Карамера | 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 |