Я использую Delphi XE2 Update 3. Существуют проблемы с точностью даже для самых простых чисел с плавающей запятой (например, 3.7). Учитывая этот код (32-битное консольное приложение):
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils;
var s: Single; d: Double; x: Extended;
begin
Write('Size of Single ----- '); Writeln(SizeOf(Single));
Write('Size of Double ----- '); Writeln(SizeOf(Double));
Write('Size of Extended --- '); Writeln(SizeOf(Extended)); Writeln;
s := 3.7; d := 3.7; x := 3.7;
Write('"s" is '); Writeln(s);
Write('"d" is '); Writeln(d);
Write('"x" is '); Writeln(x); Writeln;
Writeln('Single Comparison');
Write('"s > 3.7" is '); Writeln(s > 3.7);
Write('"s = 3.7" is '); Writeln(s = 3.7);
Write('"s < 3.7" is '); Writeln(s < 3.7); Writeln;
Writeln('Double Comparison');
Write('"d > 3.7" is '); Writeln(d > 3.7);
Write('"d = 3.7" is '); Writeln(d = 3.7);
Write('"d < 3.7" is '); Writeln(d < 3.7); Writeln;
Writeln('Extended Comparison');
Write('"x > 3.7" is '); Writeln(x > 3.7);
Write('"x = 3.7" is '); Writeln(x = 3.7);
Write('"x < 3.7" is '); Writeln(x < 3.7); Readln;
end.
Я получаю этот вывод:
Size of Single ----- 4
Size of Double ----- 8
Size of Extended --- 10
"s" is 3.70000004768372E+0000
"d" is 3.70000000000000E+0000
"x" is 3.70000000000000E+0000
Single Comparison
"s > 3.7" is TRUE
"s = 3.7" is FALSE
"s < 3.7" is FALSE
Double Comparison
"d > 3.7" is TRUE
"d = 3.7" is FALSE
"d < 3.7" is FALSE
Extended Comparison
"x > 3.7" is FALSE
"x = 3.7" is TRUE
"x < 3.7" is FALSE
Вы можете видеть, что extended
— единственный тип, который вычисляется правильно. Я думал, что точность — это проблема только при использовании сложных чисел с плавающей запятой, таких как 3.14159265358979323846
, а не таких простых, как 3.7
. Проблема при использовании single
имеет смысл. Но почему double
не работает?
short answer
. Вот человекreadable article
иdetailed story
. - person TLama   schedule 15.05.2014Extended
, конечно, не волшебное решение. - person James L.   schedule 15.05.2014