2016-12-06 18 views
2

Cライブラリの結果を格納するためにSQL Server 2014を使用しています。最近では、1.39202924295074E-309のような値がフロートとして定義された列に格納されていることがわかりました。SQL Serverに浮動小数点数が2.23E-308未満(倍精度の最小値)

MSDNに基づいて、フロートの範囲は、私が発見された文献と一致しているデフォルトで

-1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308 

あるので、これは奇妙です。

なぜ、私たちは最小値よりも小さい値を得たのですか?テーブルは、それが見えるかもしれませとして

CREATE TABLE [dbo].[CLibDataResult](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Result] [float] NOT NULL 
) 
+0

どのようにデータが追加されていますか?データベースから値をどのように照会していますか? – Tanner

+0

このデータは、従来のC libの結果です。私はちょうどthattableから*を選択することができます –

+0

私はそれが "余分な"小数点以下の桁落ちを防止しようとしたと考えています – Cato

答えて

5

インターネットで掘り下げた後、私は私の質問に答えることができると思う。参考文献の1つはpageであり、これはpageです。

ここには2つの概念があり、1つは正の最小正の数であり、もう1つは正の最小数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 | 
-------------------------------------------------------------- 

、最小表現は4.9406564584124654e-324及び1.39E-309よりも大きくなっています。したがって、SQLサーバーは倍精度のIEEE標準に準拠しています。

0

奇妙なようなものに設計されて

、あなたが与える値が範囲内です。あなたは、.NETを使用する場合は、このコードでそれをテストすることができます。

var d = double.Parse("1.39202924295074E-309"); 
var min = double.Parse("-1.79E+308");    
Console.WriteLine(d > min); // returns true 

私は、MSDNのテキストが混乱していると思います。

+0

なぜそれは範囲内ですか? –

+0

正直言って、私は数学者ではありませんが、私は-1.79E + 308が本当に小さな負の数であると信じています。 1.39202924295074E-309は正の数です(実際には小さいですが、0より大きく、したがって-1.79E + 308よりも大きくなります)。 – Ash8087

+0

double.Parse( "1.3E-500");を使用した場合はどうなりますか? ? –

0

あなたはこの

update [CLibDataResult] set result = power(cast(10.000 as float),-300); 

または

INSERT [CLibDataResult] VALUES(power(cast(10.000 as float),-300)); 

でオフを開始し、その後、繰り返しあなたが値を見ることができ

update [CLibDataResult] set result = result/10; 
select * from [CLibDataResult]; 

を実行した場合、その後の電子308その周りを、小さくなり何らかの形で利用可能な数字が少なくなると精度が低下するように見えますが、最終的にゼロになるだけです

関連する問題