AlexanderGreyдело в том что числа в компьютере имеют ограниченное число разрядов. Поэтому не возможно точно представить действительные числа.
Тут можно прочитать. Правда статья пафосная.
http://www.delphikingdom.com/asp/viewit ... alogid=374Второе это то что после каждой операции происходит округление чисел. Поэтому точность теряется.
А да проблема от перестановки слагаемых сумма меняется. Сразу успокою в большинстве случаев не критично.
Можете заглянуть сюда и убедится. Да нужна регистрация.
http://www.intuit.ru/department/superco ... seraspp/2/примерно на 54 минуте можно посмотреть как виду числа с плавающей точкой при сложение в разном порядке(задача про крокодила).
Третье есть разные форматы чисел с плавающей точкой single, double, long double( extended в паскале)
С++
Код:
double v;
v=0.1;
if(v==0.1){
cout<<"равен";}
else{
cout<<"не равно";}
При такой записи не исключен случай не равенства ввиду того что 0.1 точно не представим.
А во вторых в записи v==0.1 число 0.1 скорее всего будет иметь тип long double, а v тип double Это значит что числа v компьютер преобразует к long double путём замены недостающих разрядов нулями. Поэтому такое сравнение не сработает.
Четвёртое sin, sqrt, power, exp итд. обычно на CPU вычисляются с точностью double. Умножение и сложение умеют большую точность. Но они могут быть вычислены и с меньшей точностью. Что используется для ускорения при оптимизации. До недавнего времени на GPU sin и cos к примеру считаются с точностью single сейчас вроде как наметился переход к double.
Поэтому сравнение надо делать с некоторым допуском.
Пример таких сравнений на Borland pascal.
Код:
{ Проверяет два числа на равенство с точностью до Eps }
Function Eq(Const a,b : Real) : Boolean;
Begin
Eq:=Abs(a-b)<=Eps;
End;
{ Проверяет два числа на неравенство с точностью до Eps }
Function Ne(Const a,b : Real) : Boolean;
Begin
Ne:=Abs(a-b)>Eps;
End;
{ Проверяет два числа на "меньше или равно" с точностью до Eps }
Function Le(Const a,b : Real) : Boolean;
Begin
Le:=(a<=b) Or Eq(a,b);
End;
А да в своё время взял отсюда
http://antosha.com/onzi/modules/geometry.zip