お世話になります。
StdDev関数の配列に同じ値が入ると0になると思うのですが、
たまに「不正な浮動小数点数演算命令」というエラーになってしまい、困っています。どなたかお助けください。
エラーになる数値は
①509.107
②-90.359
例えば、これでエラーになります。
var
i : Integer;
AA : Double;
BB : array of Double;
begin
setlength(BB, 9);
for i := 0 to 8 do
begin
BB[i] := 509.107;
end;
AA := StdDev(BB); ←ここでエラー
end;
環境はWinXP、D6(Enterprise)です。
よろしくお願いします。
Win2K,D5でもエラーになりました。
バグですかねぇ?
try〜exceptでエラーを捕まえて、
エラーになったら、自力で標準偏差を計算するしかないような・・・
ちなみに値の平均値はいくつ?
標準偏差を自力で求めたら何か分かるかも。
TotalVarianceの時点で誤差が発生しますね。
デバッガでみると、
2乗和 2332709.437
合計の2乗を配列の数で割った数 2332709.437
で、その差は0のはずですが、
-2.2737367544e-13
となっています。
# Delphi7で確認
Doubleで渡していて、内部でExtendedで計算しているため、微妙に誤差が出るみたいです。
一応、Delphiと同じロジックにするのであれば、
StdDev(BB)
を、
Sqrt(Abs(Variance(BB)))
とすれば出ます。
QualityCentralのレポートがありました参考に
http://qc.embarcadero.com/wc/qcmain.aspx?d=6394
manbon様、あ様、にしの様、とおりすがりの2様
このたびはありがとうございます。
大変参考になりました。
にしの様より教えていただいた
Sqrt(Abs(Variance(BB)))
にて解決できそうです。
ツイート | ![]() |