![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Помогите пожалуйста досканально понять следующий факт
Код:
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
|
|||
|
|||
|
Цитата:
|