У меня вон чего получилось
===============================
[r-asian@AI tmp]$ cat pricision.php
<?php
$a=1/1000000;
$b=1/1000000;
for ($i=1;$i<1000000;$i++)
{
$a+=$b;
}
printf("%.18lf\n",$a);
?>
[r-asian@AI tmp]$ php pricision.php
1.000000000007918111
=================================
хотя он наверняка тут использует double
В общем если ты не решаешь там диффуры методом Эйлера итераций тыщ так в 50(да ещё с функцией гадского вида), или не решаешь СЛАУ (эдак 1000х1000) итерационными методами (или ещё чего поинтереснее), то думаю, что такая погрешность все равно приемлема. Не потеряется ни копейки :-)
p.s. это я для порядку патчик наложил, а то бывает что метод критикуют и за меньшие грехи ;-)
> Понятно, что fixed-point рулит, но пока его реализуешь в PHP...
PHP? Для финансовых вычислений? Бред какой-то. Ладно, хоть я и ламер в финансах, выскажу свое ламерское мнение по поводу использования float.
8-10 знаков - это ничтожная точность (хотя, конечно, смотря какие финансы). Насколько я знаю, в финансовых учреждениях существуют строгие правила вычислений с учетом всяческих округлений. Причем эти правила остались практически неизменными с позапрошлого века, когда никаких компьютеров еще и в помине не было. Так вот, основная проблема с float'ами - тяжело контролировать правила округления.
Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили. Так что, правила есть правила, и их надо соблюдать - нехорошо считать деньги в чужом кармане, пусть это и будут какие-то смехотворные доли процентов.
Поэтому стоит использовать именно fixed с самописными операциями, выполняемыми по финансовым правилам. Это не так сложно - в Python и LISP, например (это, конечно, не то, что принято в финансовых учреждениях, но и не жуткий PHP), встроена целочисленная арифметика произвольной точности (в LISP я без проблем считал 100000!).
А тут еще, похоже, у тебя имеются серьезные проблемы с floating point машинными вычислениями. Элементарную операцию --- вычисление точности представления числа --- и то не можешь реализовать. Рекомендую не связываться с floating point и, тем более, с PHP в вопросах денег.
Вообще-то в PHP есть функции для bcmath, где точность может быть произвольной. Сами пыхпыхмэйкеры знают, что встроенный флоут для ответственных расчетов не проканает.
> Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет.
Собственно, это называется "метод салями". А раз это даже умудрились проименовать, то не такая уж это и байка, думаю... :)
>> слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили.
Гарри Гаррисон, роман "Рождение Стальной крысы", 1985 год, только недавно читал :)
>Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили.
Вообще-то это не байка, а правда. В 90-каком-то году в Н-ске возбудили дело, именно всё было как ты описал, не знаю как насчет посадили. Но то ли по 145, то ли по 147 статье точно возбудились. И как минимум уволили и штрафанули.