LINUX.ORG.RU

Ответ на: комментарий от r_asian

>А почему, собственно тип с плавающей точкой? Почему, например, не длинное целое?

Хотелось бы с ним общаться, как с вещественным числом. Понятно, что fixed-point рулит, но пока его реализуешь в PHP...

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

У меня вон чего получилось
===============================
[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

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

>[r-asian@AI tmp]$ php pricision.php >1.000000000007918111

А ведь вправду. На умножение и того меньшая погрешность. Ладно, спасибо за вразумление :)

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от r_asian

Упс.
Небольшой патч, влияющий на знак абсолютной погрешности :-)

s/$i<1000000/$i<999999/

Итого:
[r-asian@AI tmp]$ cat pricision.php
<?php

        $a=1/1000000;
        $b=1/1000000;
        for ($i=1;$i<999999;$i++)
        {
                $a+=$b;
        }
        printf("%.18lf\n",$a);
?>
[r-asian@AI tmp]$ php pricision.php
0.999999000007918148

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Короче, и так видно, что нормальные вычисления возможны до 8-9-10 знака после запятой (десятичной точки). Так?

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

Угу.

В общем если ты не решаешь там диффуры методом Эйлера итераций тыщ так в 50(да ещё с функцией гадского вида), или не решаешь СЛАУ (эдак 1000х1000) итерационными методами (или ещё чего поинтереснее), то думаю, что такая погрешность все равно приемлема. Не потеряется ни копейки :-)

p.s. это я для порядку патчик наложил, а то бывает что метод критикуют и за меньшие грехи ;-)

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Большое спасибо! Мозги вправлены :)

Ay49Mihas ★★★★
() автор топика

лучше счёты заюзай с плавающими костяшками.

Dickhead
()
Ответ на: комментарий от Ay49Mihas

> Понятно, что fixed-point рулит, но пока его реализуешь в PHP...

PHP? Для финансовых вычислений? Бред какой-то. Ладно, хоть я и ламер в финансах, выскажу свое ламерское мнение по поводу использования float.

8-10 знаков - это ничтожная точность (хотя, конечно, смотря какие финансы). Насколько я знаю, в финансовых учреждениях существуют строгие правила вычислений с учетом всяческих округлений. Причем эти правила остались практически неизменными с позапрошлого века, когда никаких компьютеров еще и в помине не было. Так вот, основная проблема с float'ами - тяжело контролировать правила округления.

Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили. Так что, правила есть правила, и их надо соблюдать - нехорошо считать деньги в чужом кармане, пусть это и будут какие-то смехотворные доли процентов.

Поэтому стоит использовать именно fixed с самописными операциями, выполняемыми по финансовым правилам. Это не так сложно - в Python и LISP, например (это, конечно, не то, что принято в финансовых учреждениях, но и не жуткий PHP), встроена целочисленная арифметика произвольной точности (в LISP я без проблем считал 100000!).

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

А тут еще, похоже, у тебя имеются серьезные проблемы с floating point машинными вычислениями. Элементарную операцию --- вычисление точности представления числа --- и то не можешь реализовать. Рекомендую не связываться с floating point и, тем более, с PHP в вопросах денег.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Вообще-то в PHP есть функции для bcmath, где точность может быть произвольной. Сами пыхпыхмэйкеры знают, что встроенный флоут для ответственных расчетов не проканает.

Быть может, их и надо использовать.

shimon ★★★★★
()
Ответ на: комментарий от watashiwa_daredeska

> Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет.

Собственно, это называется "метод салями". А раз это даже умудрились проименовать, то не такая уж это и байка, думаю... :)

AngryElf ★★★★★
()
Ответ на: комментарий от Ay49Mihas

Абасрацца. Финансовые вычисления - в PHP?!? Да ты очень болен. Тебя уже не вылечат!

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

>> слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили.

Гарри Гаррисон, роман "Рождение Стальной крысы", 1985 год, только недавно читал :)

home_user ★★★
()
Ответ на: комментарий от home_user

Есть подозрение, что Гарри Гаррисон не сам эту байку придумал :) Очень старый фольклёр, однако :)

Casus ★★★★★
()
Ответ на: комментарий от home_user

> Гарри Гаррисон, роман "Рождение Стальной крысы", 1985 год

Помню, что в какой-то художественной книжке (возможно, у Гаррисона) я потом встречал этот метод, но мне он был уже известен к тому моменту.

watashiwa_daredeska ★★★★
()

В процессорах Intel уже 15 лет поддерживается ошибка округления в fpu ... наводит на мысль

robot12 ★★★★★
()
Ответ на: комментарий от watashiwa_daredeska

>Когда я еще в школе учился (когда компьютеры уже стали маленькими, а программы еще не стали большими), слышал байку про одного программиста, который в банковской программе изменил алгоритм округления и разницу в доли цента с каждой операции переводил себе на счет. Получилась доволно кругленькая сумма. Программиста посадили.

Вообще-то это не байка, а правда. В 90-каком-то году в Н-ске возбудили дело, именно всё было как ты описал, не знаю как насчет посадили. Но то ли по 145, то ли по 147 статье точно возбудились. И как минимум уволили и штрафанули.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.