パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Excelの統計機能は不正確」記事へのコメント

  • by Anonymous Coward
    なんかデジャブな感じがするんだが、Excelの算術関数・統計関数は精度が悪いとか、バグがあるとかいう話は昔からあったんじゃなかったっけ?(ソース忘れた)
    • Re: (スコア:1, 参考になる)

      by Anonymous Coward
      Excel2002だと、sinh(1e-19)がゼロになったりして駄目駄目なんですが、2007では直ってますか?

      # xがゼロの近傍で、sinh(x)≒xになる筈。
      • Re:デジャブ? (スコア:2, 参考になる)

        by kawa-t (37052) on 2008年10月27日 20時20分 (#1445104) 日記
        ただ単に、倍精度の浮動小数点で計算していて、0近傍の値を考慮していないなら、処理系を問わず、そうなります。内部的には、

        sinh(x)=(exp(x)-exp(-x))/2

        で計算していて、0近傍でexp(x)≒1+x、exp(-x)≒1-xとなるので、これらの値が倍精度で表現出来なくなったところで終わりです。パーセントオーダーの精度だと5e-15で終わりです。

        MzScheme(Schemeの処理系の1つ)でも試してみましたが、倍精度なので結果は同じです。sinhは無いので、上記の式を使いました。

        ただ、個人的には、この手の計算をするときにExcelを使う奴の方が間違っていると思う。
        親コメント
        • by deleted user (3911) on 2008年10月27日 21時25分 (#1445159)
          そういえば、N88-BASIC だったか、その頃の MS-BASIC でもそういった安直な
          関数計算をしていて有効桁が少ないという問題がありましたね。
          あと、sqrt(x) を x^0.5 で代用しているのでこれも有効桁が少ないという
          問題がありました。(真面目に計算するならニュートン法でも使うところ。)

          親コメント
        • by kawa-t (37052) on 2008年10月28日 1時49分 (#1445402) 日記
          exp(x)をマクローリン展開すると、1とΣ(x^k)/(k!)の和でexp(x)を求められるので、1を足さなければ、exp(x)-1を精度よく計算できます。それを用いてsinh(x)を計算させてみると、

          > (sinh 1e-4)
          0.00010000000016666667
          > (sinh 1e-5)
          1.0000000000166668e-005
          > (sinh 1e-6)
          1.0000000000001666e-006
          > (sinh 1e-7)
          1.0000000000000017e-007
          > (sinh 1e-8)
          1e-008

          Excelのsinh(x)では

          1.00E-04のとき、

          1.00000000166689E-04

          ですが、1.00E-05のとき、

          1.00000000001210E-05

          となるので、Excelでは、1e-5のときの下位の桁は信頼できません。

          因みに、MzSchemeで計算しましたが、exp(x)-1を求める関数は、

          (define mexp (lambda (x) (exact->inexact (let loop1 ((n 60)) (if (= n 0) 0 (+ (let loop2 ((n n)) (if (= n 0) 1 (* (/ x n) (loop2 (- n 1))))) (loop1 (- n 1))))))))

          マクローリン展開のnは60としましたが、0近傍ではそんなにいりません。
          親コメント

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

処理中...