2012-01-17 6 views
2

SQL Server 2008を使用していますが、私の要件の1つは母集団標準偏差を計算することです。 SQL Serverには、同じものとして組み込み関数stdevpが用意されています。私はそれを使用していますが、私が得ている結果に悩まされています。同じ数字のグループの母集団標準偏差はゼロでなければならないが、ここでは微妙な値ではあるが異なるものがある。SQL Serverの組み込み関数Stdevpが正しく計算されない

drop table guest.tempTable; 

create table guest.tempTable (column1 varchar , column2 decimal(10,6)) 

insert into guest.tempTable values('a',3578.2700); 
insert into guest.tempTable values('a',3578.2700); 
insert into guest.tempTable values('a',3578.2700);   
insert into guest.tempTable values('a',3578.2700); 

insert into guest.tempTable values('a',3578.2700); 
commit; 

次は、STDEVPクエリです:私が得る

select stdevp(column2) from guest.tempTable 
group by column1 

結果は0.00となっているはずです

------------------------ 
5.459150335692846E-5 

です。

stdevpのドキュメントでは、floatを返すと記載されています。だから私はこれを切り捨てなければならないと思っていますが、私は解決策を見つけることができません。

答えて

1

浮動小数点数は100%正確ではありません。

浮動小数点数は正確にすべての 実数を表し、および浮動小数点演算を正確に が真の算術演算を表すことができないということができないという事実は、多くの驚くべき 状況につながります。これは、 のコンピュータが一般的に数値を表す有限精度に関連しています。

たとえば、0.1と0.01(バイナリで)の非表明性は、は、0.01を正方形にしようとした結果が、0.01にも最も近い表現可能な数値でもないことを意味します。 24ビット(単精度) 表現では、0.1(小数)は以前にe = -4として与えられていました。この数を二乗

0.100000001490116119384765625 exactly. 

あるS = 110011001100110011001101は、

0.010000000707805156707763671875 exactly. 

しかし与える( 丸めで)単精度浮動小数点ハードウェアでそれを二乗

0.010000000298023226097399174250313080847263336181640625 exactly. 

与えます0.01に最も近い表現可能な数値は

です。
0.009999999776482582092285156250 exactly. 

あなたはそれHEREについて読むことができます。

+0

はい、この問題は四捨五入されていますが、上記のフィールド(またはデータ型自体)の精度を変更した場合など、正しい結果を得られる解決法があれば、しかし、私はそれがまだ同じ浮動小数点演算を行っていると思います。( – rirhs

+1

浮動小数点なしでそれを行う可能性のある解決策が1つあります。 –

+0

他のデータ型を使用しようとしましたが、アプリケーション層のstdevをデータベース層で計算するのではなく、計算することに頼っています。そして、それを許容範囲内に丸めます。何らかの形で、javaのstdevは、SQLServerと比較して比較的正確な結果を得ています(ただし、まだ0にはなりません)。したがって、私はこのアプローチをとっています。 – rirhs

関連する問題