相关疑难解决方法(0)

Delphi Tokyo 64位将非正规数字刷新为零?

在短暂查看system.math的源代码时,我发现64位版本的Delphi Tokyo 10.2.3将非正规的IEEE-Doubles刷新为零,从后面的程序可以看出;

{$apptype console}
uses
  system.sysutils, system.math;
var
  x: double;
const
  twopm1030 : UInt64 = $0000100000000000; {2^(-1030)}
begin
  x := PDouble(@twopm1030)^;
  writeln(x);
  x := ldexp(1,-515);
  writeln(x*x);
  x := ldexp(1,-1030);
  writeln(x);
end.
Run Code Online (Sandbox Code Playgroud)

对于32位,输出是预期的

8.69169475979376E-0311
8.69169475979376E-0311
8.69169475979376E-0311
Run Code Online (Sandbox Code Playgroud)

但我得到了64位

 8.69169475979375E-0311
 0.00000000000000E+0000
 0.00000000000000E+0000
Run Code Online (Sandbox Code Playgroud)

因此,东京基本上可以在64位模式下处理非正规数,常量被正确写入,但是从算术运算或甚至用ldexp,非正规结果被刷新为零.

可以在其他系统上确认这一观察结果吗?如果是,在哪里记录?(我能找到关于零冲洗的唯一信息是Denormals become zero when stored in a Real48).

更新:我知道,这两个 32位和64位的单超负荷使用.对于32位,使用x87 FPU,ASM代码对于所有精度(单,双,扩展)几乎相同.FPU总是返回一个80位扩展,它存储在一个double中而不会过早截断.64位代码在存储之前进行精确调整.与此同时,我提交了一份问题报告(https://quality.embarcadero.com/browse/RSP-20925),重点关注32位或64位的不一致结果.

delphi floating-point

20
推荐指数
2
解决办法
323
查看次数

标签 统计

delphi ×1

floating-point ×1