【发布时间】:2014-05-15 21:28:30
【问题描述】:
我正在使用 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。 -
3.7 并不简单。 3.75 是。或 3.71875 f.i.如果你想更近一点,或者 3.69921875...
-
我不敢相信这不是重复的。我进行了快速搜索,但没有找到任何东西。
-
所有伟大的 cmets,感谢您的文章。
-
请不要以为你可以只使用extended,突然一切都会好起来的
标签: delphi floating-point-precision