在 Delphi 中,Extended
数据类型在 Win32 和 Win64 平台上有不同的实现。Win32 中的 Extended
是 10 字节的浮点数,而 Win64 中的 Extended
是 8 字节的浮点数。为了在 Win64 环境中读取 Win32 应用程序生成的 10 字节 Extended
数据,并转换为 8 字节的浮点数(接受精度损失),可以使用 TExtended80Rec
类型和 TExtendedHelper
。
- 1. 使用
TExtended80Rec
读取 10 字节数据:- •
TExtended80Rec
是一个 10 字节的记录类型,用于处理 80 位浮点数。 - • 可以从文件中读取 10 字节数据到
TExtended80Rec
类型的变量中,然后通过显式类型转换将其转换为Extended
或Double
。
- •
- 2. 跨平台兼容性:
- • 为了确保跨平台兼容性,建议在代码中使用
Double
类型,因为它在所有平台上都支持。
- • 为了确保跨平台兼容性,建议在代码中使用
代码实现
以下是一个简单的函数,用于从流中读取 80 位浮点数并转换为 Double
值:
function Read80BitExtended(Stream: TStream): Double;
var
Value: TExtended80Rec;
begin
Stream.ReadBuffer(Value, SizeOf(Value));
Result := Extended(Value);
end;
注意事项
- • 如果读取的值超出了
Double
的范围,可能会触发浮点溢出错误。在 Delphi 12 之前的版本中,默认情况下会抛出异常,而在 Delphi 12 中,浮点异常默认被屏蔽,不会抛出异常。
更兼容的数据类型
为了确保跨平台兼容性,建议使用以下数据类型:
- • Double 和 Single:这些是 IEEE 754-1985 标准的浮点数类型,被许多编程语言支持,是行业标准。
- • 自定义数据类型:如果对数据的存储和读取有最高优先级,可以使用整数类型来存储浮点数的符号、指数和分数部分,例如:
- • 4 字节符号/尾数(1 个 Cardinal)
- • 4 字节指数(1 个 Cardinal)
- • 8 字节分数(2 个 Cardinal)
- • 使用
TExtended80Rec
可以读取 Win32 应用程序生成的 10 字节Extended
数据,并转换为 Win64 支持的 8 字节浮点数。 - • 为了确保跨平台兼容性,建议在代码中使用
Double
类型。 - • 如果需要更高的兼容性,可以考虑使用自定义的数据类型来存储浮点数。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END