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

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

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

      by Anonymous Coward on 2008年10月27日 14時03分 (#1444840)
      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近傍ではそんなにいりません。
          親コメント
      • by flutist (16098) on 2008年10月27日 14時16分 (#1444850)
        内部ではちゃんと値を保持してても、表示するところで安直に 0 にしている、というような話を聞いたことがあります。

        なんか設定でそういうのをいじれれば、良くなるかも。
        親コメント
        • Re:デジャブ? (スコア:2, 参考になる)

          by Anonymous Coward on 2008年10月27日 16時08分 (#1444921)
          >表示するところで安直に 0 にしている、というような話を聞いたことがあります。

          違うっぽいかも。
          セルの値を=Sinh(1E-19)/1E-19にしても0だから。
          1E-16前後あたりから値がおかしくなる。
          でもSin(x)/xだと(xが十分小さいところで)問答無用でちゃんと1になるから、内部的に
          どういう展開を使うかあたりで怪しいんかねぇ。
          親コメント
          • by Anonymous Coward
            sinh()の部分は偉い人が書いたからいじるにいじれないと云うオチだったらやだなぁ。
      • by Anonymous Coward
        =SINH(0.0000000000000000001)
        に自動変換され、セルには0とでますね。セルのプロパティから数値で小数点以下の桁数30にした状態でも0.0です。小数点以下に0が多く並んでるが数えるの面倒だから放置
        • by Anonymous Coward
          A1に"=sinh(1E-19)"を入力した状態で
          =IF(A1=0, "真", "偽")としてみると
          sinh(1E-16)までは偽で、sinh(1E-17)から真となりました。
          元コメントにあるとおり1E-16辺りから怪しいようです。
          # さらにsinh(6E-17)では偽、sinh(5E-17)では真……って何ヒマな事をやってるんだろ

          (*) 一応注意しておくと、sinh(6E-17)まで正しいという訳ではないです。

身近な人の偉大さは半減する -- あるアレゲ人

処理中...