|
|
|||||
Где-то тута подвох чтоль?
По идее x1=0.7 x2=0.07, но помню у меня были всякие веселые вещи типа строка в СИ i=0; дебаггером Си проверям - i принимает произвольное значение от 0 до NAN. Глюки всякие возможны
__________________
suum quique |
|
|||||
Гы%)
Я в уме тоже эти цыфры получаю (всегда) А вот флеш супер точный, вычислительный прибор Со мной несоглсен (сто байт ему в дышло) по его мнению: x1 = 0.700000000000003 x2 = 0.0699999999999932 ЗЫ У меня на самом деле проблем не каких... ЗЗЫ А вдруг кому-нить понадобиться
__________________
Старый плюс лучше новых двух. I like RTFM попросил - подожди - обработай Chr(255) == '\xFF' - это про "я" lexass |
|
|||||
Операции над числами с плавающей точкой всегда вычисляются округленно. Точность зависит от представления числа в компьютере. Для двойной точности (8-ми байтовые числа с плавающей запятой - double) точночть составляет 15-16 знаков после запятой. Поэтому с компьютерной точки зрения флэш выдает совершенно правильный ответ. Все эти ошибки округления появляются не во флэше а в самам процессоре.
|
|
|||||
Регистрация: Oct 2001
Адрес: в Петербурге
Сообщений: 2,430
|
дело в том, что Флеш трансформирует числа из 10ичной в 2ичную систему счисления для своих операций, а потом тебе отдает обратно переделанное число (2 -> 10) при этих операциях неизбежны погрешности и округления, например 0.3 в 2ичной системе чуть ли не иррациональное число, также как 1/3 в десятичной - 0.33333333333333333...33
PS: А никто и не обещал, что Флеш - точный прибор. |
|
|||||
Флэш зесь ни при чем. И иррациональные числа здесь тоже ни при чем. Вы выполните этот примерчик в Delphi, C++ или что вам ближе, у вас будет то же самое. Это ошибки округления при операциях с плавающей точкой в процессоре.
Цитата:
Из десятичной в двоичную и обратно числа переводятся БЕЗ потери точности. Не надо путать двоичную систему (или n-ичную) c обычными дробями - это большая разница. К тому-же с чего ты взял, что числа во флэше представлены в 10-ном виде? Они там вполне двоичные. |
|
|||||
Это еще чё! Я вот такой глюк в 1С откапал, хоть плачь хоть смейся:
Сумма=34317.93; Сум=Сумма*(0.2/(0.2+1)); Сообщить(Сум); Сообщить(Окр(Сум,2,1)); выдает 5719.655 и 5719.65 //округление а теперь немного изменим код Сумма=34317.93; Сум=Сумма*0.2/(0.2+1); ^ ^ убраали скобки. Сообщить(Сум); Сообщить(Окр(Сум,2,1)); выдает 5719.655 и 5719.66 вот так мы и уклоняемся от налогов 8)))))
__________________
Трудно быть одному и ждать рассвет, как спасенье.... |
|
|||||
В первом случае
компьютер сначала делит 0.2 на 1.2, а потом умножает ее на Cумму, во втором сначала умножает Сумму на 0.2, а затем результат делит на 1.2. Если вычислять разными путями, то ошибки округленя будут разными. Вот вам примерчик: e=1e-20; c=1; c+=e; // с останется равной 1, т.к. 1.00000000000000000001 находится за пределами точности (обычно для дробных чисел используются числа double, а это - 15-16 значащих цифр). d=e/(c-1); // Получится INF, а должно 1 Если вы работаете с числами с плавающей точкой, то не мешает знать все эти тонкости, чтоб не напороться на грабли. Это не ошибка - это принципиальная особенность работы компьютера с дробными числами. |
|
|||||
угу, знакомый прикол из С++
в моем примере весь глюк в представлении сопром числа вида 0.333(3) т.е. периодической дроби. глюк воникает,если число выглядит как 0.5549999999999999999999 что при округлении даст 0.55, хотя на самом деле это число выглядит как 0.555, дающая при округлении 0.56
__________________
Трудно быть одному и ждать рассвет, как спасенье.... |
Часовой пояс GMT +4, время: 19:22. |
|
« Предыдущая тема | Следующая тема » |
|
|