StdDevの不正?

解決


ほとほと  2009-08-13 15:18:01  No: 35411  IP: 192.*.*.*

お世話になります。
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-13 16:52:17  No: 35412  IP: 192.*.*.*

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

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

編集 削除
 2009-08-13 20:09:15  No: 35413  IP: 192.*.*.*

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

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

編集 削除
にしの  2009-08-13 20:30:30  No: 35414  IP: 192.*.*.*

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

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

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

編集 削除
とおりすがりの2  2009-08-13 20:38:41  No: 35415  IP: 192.*.*.*

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

編集 削除
ほとほと  2009-08-14 10:22:34  No: 35416  IP: 192.*.*.*

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

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

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

編集 削除