StdDevの不正?

解決


ほとほと  2009-08-14 00:18:01  No: 35411

お世話になります。
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)です。
よろしくお願いします。


manbon  2009-08-14 01:52:17  No: 35412

Win2K,D5でもエラーになりました。
バグですかねぇ?

try〜exceptでエラーを捕まえて、
エラーになったら、自力で標準偏差を計算するしかないような・・・


  2009-08-14 05:09:15  No: 35413

ちなみに値の平均値はいくつ?

標準偏差を自力で求めたら何か分かるかも。


にしの  2009-08-14 05:30:30  No: 35414

TotalVarianceの時点で誤差が発生しますね。
デバッガでみると、
2乗和 2332709.437
合計の2乗を配列の数で割った数 2332709.437
で、その差は0のはずですが、
-2.2737367544e-13
となっています。
# Delphi7で確認

Doubleで渡していて、内部でExtendedで計算しているため、微妙に誤差が出るみたいです。

一応、Delphiと同じロジックにするのであれば、
StdDev(BB)
を、
Sqrt(Abs(Variance(BB)))
とすれば出ます。


とおりすがりの2  2009-08-14 05:38:41  No: 35415

QualityCentralのレポートがありました参考に
 
http://qc.embarcadero.com/wc/qcmain.aspx?d=6394


ほとほと  2009-08-14 19:22:34  No: 35416

manbon様、あ様、にしの様、とおりすがりの2様

このたびはありがとうございます。
大変参考になりました。

にしの様より教えていただいた
Sqrt(Abs(Variance(BB)))
にて解決できそうです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加