对于64位版本,Trunc()针对高Int64失败

TmT*_*ron 4 delphi 64-bit

为什么以下代码在64位版本中失败(但适用于32位版本)?

var
  TruncTmp: Extended;
begin
  TruncTmp := 9223372036854775296;
  TruncTmp := Trunc(TruncTmp); // this fails on 64-bit
  Assert(TruncTmp = 9223372036854775296);
end;
Run Code Online (Sandbox Code Playgroud)

第一次机会异常在$ 0000000000405D70.消息'c0000090 FLOAT_INVALID_OPERATION'的异常类$ C0000090.

这是一个错误还是我错过了什么?

笔记:

  • 我正在使用Delphi 10.2
  • 数字< 9223372036854775296工作正常

Arn*_*hez 12

Win64下没有"扩展"(80位FP)类型 - 它只是"双"(64位FP)的别名.所以你只有53位的分辨率.

所以我的猜测是你的情况如预期的那样.

  • 这是精确损失的原因,而不是例外 (2认同)