【发布时间】:2021-01-16 21:53:06
【问题描述】:
背景
我想创建一个单元测试来测试 Delphi 的某些 rtl 方面,为了做到这一点,我想使用非常具体的 IEEE 浮点值,我想直接从它们的二进制表示中创建。
到目前为止,我已经想出了这个例程,它确实可以完成这项工作。
function TestIEEEDouble.BuildDoubleFromRawInt64(const aBinData:UInt64):double;
begin
CheckEquals(sizeof(aBinData),sizeof(Result),'sizeof(aBinData),Sizeof(Result)'); // ensures we dont mess up with wrong types
Move(aBinData,Result,sizeof(Result));
end;
使用如下(bindata可能还是错,但这不是问题):
procedure TestIEEEDouble.Setup;
begin
inherited;
FSmallestPositiveDouble:=BuildDoubleFromRawInt64($0000000000000001);
FSmallestNegativeDouble:=BuildDoubleFromRawInt64($8000000000000001);
FLargestPositiveDouble :=BuildDoubleFromRawInt64($7FEFFFFFFFFFFFFF);
FLargestNegativeDouble :=BuildDoubleFromRawInt64($8FEFFFFFFFFFFFFF);
end;
问题
是否存在允许直接从看起来像这样的二进制(十六进制)表示创建const double 的语法:
const
cSmallestPositiveDouble:double=double($0000000000000001);
结果显然不应该是1.0(使用这种语法)而是(接近)4.94065645841247e-324
【问题讨论】:
-
您可以在内联常量声明中使用仅限运行时的函数:
begin const cSmallestPositiveDouble: Double = BuildDoubleFromRawInt64($0000000000000001);
标签: delphi type-conversion ieee-754 rad-studio