|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Floor: Delphi тоже ошибается!
Помогите пожалуйста досканально понять следующий факт
Код:
program Project1; {$APPTYPE CONSOLE} uses SysUtils, math; procedure proc; var a,b,c,d:double; begin a:=0.1; b:=5; c:=floor(b/0.1); d:=floor(b/a); writeln(c); writeln(d); end; begin proc; readln; end. результат: 5.00000000000000E+0001 4.90000000000000E+0001 почему c=50, а d=49 ? (компилятор turbo delphi 2006) Заранее всем спасибо! |
#2
|
||||
|
||||
все начинается с этого:
Код:
program Project1; {$APPTYPE CONSOLE} var a: Double; begin a:=0.1; if 0.1=a then Writeln('Okay') else Writeln('Oops'); Writeln(0.1-a); Readln; end. Цитата:
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Я понимаю что сравивать два вещественных числа = "тыкать пальцем в небо". Ошибку свою понял но несовсем.
Как я понял делфи считает что 5/0,1<50 Интересно как она называется и охото узнать правила недопущения подобных ошибок, а также представление типа double в памяти. Вот моя модификация Код:
program Project2; {$APPTYPE CONSOLE} uses SysUtils, math; function myFloor(x:double):integer; begin if x>0 then result:=trunc(x) else result:=trunc(x)-1; end; procedure proc; var a,b:double; c,d:integer; begin a:=0.1; b:=5; c:=myFloor(b/0.1); d:=myFloor(b/a); writeln(c); writeln(d); end; begin proc; readln; end. результат 50 50 Застрахован ли такой подход от аналогичной ошибки при других значениях? |
#4
|
||||
|
||||
для сравнения вещественных чисел есть функция в Math:
Код:
function CompareValue(const A, B: Extended; Epsilon: Extended): TValueRelationship; function CompareValue(const A, B: Double; Epsilon: Double): TValueRelationship; function CompareValue(const A, B: Single; Epsilon: Single): TValueRelationship; Пишу программы за еду. __________________ |
#5
|
|||
|
|||
Цитата:
|