是否有编译器设置来控制如何在Delphi中键入浮点文字?

use*_*960 5 delphi floating-point literals

虽然e默认情况下工作的情况我想更改文字的默认转换,0.1以允许在r没有任何代码修改的情况下工作.这可能通过编译器选项,编译器指令或其他任何东西吗?

procedure Test;
var
  s : Single;
  r : Real;
  d : Double;
  e : Extended;
begin
  s := 0.1;
  if (s = 0.1) then ShowMessage('s matched'); // fail

  r := 0.1;
  if (r = 0.1) then ShowMessage('r matched'); // fail

  d := 0.1;
  if (d = 0.1) then ShowMessage('d matched'); // fail

  e := 0.1;
  if (e = 0.1) then ShowMessage('e matched'); // pass
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

没有编译器开关可以满足您的需求.问题是32位Windows编译器将浮点文字表示为10字节扩展精度值.并且因为0.1不完全可表示,所以不等于8字节双精度表示0.1.

文件说:

如果constantExpression是实数,则其类型为Extended.

但是,您可以使用类型常量来获得所需的结果.例如:

const 
  TenthDouble: Double = 0.1;
var
  d: Double;
....
d := 0.1;
if d = TenthDouble then
  .... 
Run Code Online (Sandbox Code Playgroud)

通过使用类型化常量,我们可以强制编译器使常量为8字节双精度表示形式0.1.

  • 我只想补充一点,扩展在64位上别名为Double,这可能会进一步使情况复杂化,因为它会导致32位和64位的不同行为.整个常数=扩展是坚果.由于这个原因,我们总是将浮点常量声明为类型化双精度. (2认同)