SQL Server的浮点数小于2.23E-308(最小双精度数)

CS *_*Pei 2 sql-server floating-point precision

我们使用SQL Server 2014来存储来自C库的结果.最近我们发现有一些值如1.39202924295074E-309存储在一个定义为float的列中.

这很奇怪,因为基于MSDN,浮点范围是

 -1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308
Run Code Online (Sandbox Code Playgroud)

默认情况下,这与我发现的任何文献一致.

所以问题是为什么我们得到的价值小于允许的最小值?

桌子的设计就像是

CREATE TABLE [dbo].[CLibDataResult](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Result] [float] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

CS *_*Pei 5

经过一些网上挖掘,我想我可以回答我的问题.其中一个参考是此页面和此页面.

这里有两个概念,一个是最小正正常数和最小正subnormal数.MSDN页面根据最小正normal数列出范围.但是基于IEEE 754,最小正正常数是在双扩展格式中可表示的最小正数.

这是双精度这些数字的备忘单,

--------------------------------------------------------------
| max normal number             |   1.7976931348623157e+308  |
--------------------------------------------------------------
| min positive normal number    | 2.2250738585072014e-308    |
--------------------------------------------------------------                                           
| max subnormal number          |   2.2250738585072009e-308  |
--------------------------------------------------------------                                           
| min positive subnormal number |   4.9406564584124654e-324  |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

总之,最小可表示为4.9406564584124654e-324和1.39E-309大于此值.因此SQL服务器符合IEEE标准的双精度.