gpt4 book ai didi

delphi - StrToFloat 和谁错了 : Delphi or ASE/SQL Server

转载 作者:行者123 更新时间:2023-12-03 15:34:42 27 4
gpt4 key购买 nike

最近我发现了奇怪的事情:结果

var
d: double;
begin
d := StrToFloat('-1.79E308');

与 ASE 和 SQL Server 通过转换为浮点字段类型的字符串值“-1.79E308”不同

INSERT INTO my_table (my_float_field) VALUES (-1.79E308)

对于 Delphi 内存转储是 9A BB AD 58 F1 DC EF FF
对于 ASE/SQL Server,选择数据包中的值为 99 BB AD 58 F1 DC EF FF

谁错了,是服务器还是 Delphi?

最佳答案

我们工作的前提是 StrToFloat 生成与所提供的十进制值最接近的可表示二进制浮点值。

您提供的两个十六进制值是相邻的。您可以看到它们的尾数相差 1。下面是一些对这两个值进行解码的 Python 代码:

>>> import struct>>> struct.unpack('!d', 'ffefdcf158adbb9a'.decode('hex'))[0]-1.7900000000000002e+308>>> struct.unpack('!d', 'ffefdcf158adbb99'.decode('hex'))[0]-1.79e+308

请记住,Python 使用尽可能短的有效值来打印浮点值,其中最接近的可表示值是实际值。在 Python 看来,ffefdcf158adbb99 解码为打印为 -1.79e+308 的值,这足以证明 ffefdcf158adbb99 是最接近的可表示形式值(value)。换句话说,Delphi 代码给出了错误的答案。

并且,出于好奇,朝相反的方向:

>>> hex(struct.unpack('<Q', struct.pack('<d', float('-1.79e308')))[0])'0xffefdcf158adbb99L'

有趣的是,32 位 Delphi 编译器生成 ffefdcf158adbb99,但 64 位 Delphi 编译器生成 ffefdcf158adbb9a。这是一个明显的缺陷,应作为错误报告提交给质量门户。

关于delphi - StrToFloat 和谁错了 : Delphi or ASE/SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34109339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com