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)
经过一些网上挖掘,我想我可以回答我的问题.其中一个参考是此页面和此页面.
这里有两个概念,一个是最小正正常数和最小正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标准的双精度.