gpt4 book ai didi

sql-server - REAL 列保存的值超出记录范围

转载 作者:行者123 更新时间:2023-12-02 23:22:17 24 4
gpt4 key购买 nike

根据MSDN ,实数值的范围是 - 3.40E + 38 到 -1.18E - 38、0 和 1.18E - 38 到 3.40E + 38。但是,我的表中有很多超出该范围的值。

以下查询返回许多非常小的值,但不返回非常大的值:

SELECT  MyColumn ,
*
FROM data.MyTable
WHERE MyColumn <> 0
AND ( MyColumn < CONVERT(REAL, 1.18E-38)
OR MyColumn > CONVERT(REAL, 3.40E+38)
)
AND ( MyColumn < CONVERT(REAL, -3.40E+38)
OR MyColumn > CONVERT(REAL, -1.18E-38)
)

很容易显示这些值如何最终出现在表中。我无法直接插入它们:

CREATE TABLE a(r REAL NULL);
GO
INSERT INTO a(r) VALUES(4.330473E-39);
GO
SELECT r FROM a
GO
DROP TABLE a;

----
0.0

但是我可以划分两列并获取超出范围的值:

CREATE TABLE a
(
r1 REAL NULL ,
r2 REAL NULL ,
r3 REAL NULL
) ;
GO
INSERT INTO a
( r1, r2 )
VALUES ( 4.330473E-38, 1000 ) ;
GO
UPDATE a
SET r3 = r1 / r2 ;
SELECT r1 ,
r2 ,
r3
FROM a

r1 r2 r3
------------- ------------- -------------
4.330473E-38 1000 4.330433E-41

所以我猜 MSDN 给出了错误的有效数据范围,对吗?我错过了什么吗?

有几个人认为这是一个错误。

此行为的哪一部分到底是错误。是吗:

  1. MSDN 中记录并在 DBCC 中使用的常量错误,以及向下舍入的阈值错误。
  2. 更新能够保存错误值

最佳答案

联机丛书仅记录单精度和 double float 的正常范围。 IEEE 754规则还指定比最小非零正常值更接近于零的 float ,称为 denormalized, denormal, and subnormal数字。从最后一个链接:

Denormal numbers provide the guarantee that addition and subtraction of floating-point numbers never underflows; two nearby floating-point numbers always have a representable non-zero difference. Without gradual underflow, the subtraction a−b can underflow and produce zero even though the values are not equal. This can, in turn, lead to division by zero errors that cannot occur when gradual underflow is used.

SQL Server 遵循 single-precision floating point 的规则发布的示例中的计算。该错误可能是 DBCC 仅检查正常值,并在遇到存储的非正常值时抛出不正确的错误消息。

生成非正规单精度值的示例:

DECLARE
@v1 real = 14e-39,
@v2 real = 1e+07;

-- 1.4013e-045
SELECT @v1 / @v2;

显示存储的float非正规通过DBCC检查的示例:

CREATE TABLE dbo.b (v1 float PRIMARY KEY);
INSERT b VALUES (POWER(2e0, -1075));
SELECT v1 FROM b; -- 4.94065645841247E-324
DBCC CHECKTABLE(b) WITH DATA_PURITY; -- No errors or warnings
DROP TABLE dbo.b;

关于sql-server - REAL 列保存的值超出记录范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297086/

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