★ 統計プログラムを書いていて変なことがあったので ★

 279 統計プログラムを書いていて変なことがあったので  トマト  2000/12/06 (水) 21:42
  330 Re: 統計プログラムを書いていて変なことがあったので  GOW  2000/12/13 (水) 13:47
   336 Re^2: 統計プログラムを書いていて変なことがあったので  トマト  2000/12/13 (水) 16:54
    343 Re^3: 統計プログラムを書いていて変なことがあったので  ふむふむ  2000/12/14 (木) 12:47
     344 Re^4: 統計プログラムを書いていて変なことがあったので  トマト  2000/12/14 (木) 13:29
  287 Re: 統計プログラムを書いていて変なことがあったので  ふむふむ  2000/12/07 (木) 12:37
   288 Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:13
  286 Re: 統計プログラムを書いていて変なことがあったので  さかぐち  2000/12/07 (木) 09:15
   289 Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:16
  284 Re: 統計プログラムを書いていて変なことがあったので  ひの  2000/12/07 (木) 00:31
   291 Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:19


279. 統計プログラムを書いていて変なことがあったので  トマト  2000/12/06 (水) 21:42
問題点だけを再現できるように抽出しました.
Function aaa(n) As Double
    aaa = 1
    For i = 1 To n
        aaa = aaa * i
    Next i
End Function
Function bbb(n) As Double
    If n <= 1 Then
        bbb = 1
        Exit Function
    End If
    bbb = n * bbb(n - 1)
End Function
Excel の VBA で階乗を計算する関数を定義するとき,再帰関数 bbb(n) とループによる aaa(n) で,
n=49 のときには
fact(49)= 6.082818640342680E+62
aaa(49) = 6.082818640342680E+62
bbb(49) = 6.082818640342680E+62
なのに,
n=50 のときに
fact(50)= 3.041409320171340E+64
aaa(50) = 3.041409320171340E+64
bbb(50) = #VALUE!
となるのはなぜなんでしょうか.

     [このページのトップへ]


330. Re: 統計プログラムを書いていて変なことがあったので  GOW  2000/12/13 (水) 13:47
始めまして,GOWといいます。私は大学院で医療情報用統計プロクラムソフトの開発をしています。VBAはあまり使ったことがないので間違っていたらごめんなさいね。
私の方でこのプログラムを再現してみたところ,きちっと動作していました。
しかし,幾度か動かすうちに言われていたエラーすべてと全く別のエラーが発生しました。考えられるものをあげてみました。
まずスタックが不足,はどうしてでしょう?この程度の計算でいくらMSといえどスタックが不足するとは思えません。考えられるのは,bbb = n * bbb(n - 1)です。
“bbb(n - 1)”で再び関数bbb(n)に飛んでしまって関数bbb(n)が終わらない場合です。この場合,配列変数を宣言してそちらに一端データを格納すれば,問題ない思います。

しかしこのエラーが原因の場合,bbb(n)は全く計算できないので,bbb(49)はでません。#VALUE!と言われる原因ははっきり断言はできませんが,不正なデータ範囲,データ形式で怒られているような気がします。変数のデータ範囲,データ形式に気をつけてプログラムをつくってあげるといいと思います。ではでは,がんばって下さい。

     [このページのトップへ]


336. Re^2: 統計プログラムを書いていて変なことがあったので  トマト  2000/12/13 (水) 16:54
> 私の方でこのプログラムを再現してみたところ,きちっと動作していました。

他の人に聞いてみました。その人はWindowsユーザなんですが,Windows版だとちゃんと動くそうです。
書くのを忘れていましたが,私はMacintoshを使っています。結局,Macintosh版にバグがあるようです。

> まずスタックが不足,はどうしてでしょう?この程度の計算でいくらMSといえどスタックが不足するとは思えません。

他のMacintoshユーザに言わせれば,「MSだもん,なんだってあり得る」ですって。

> 変数のデータ範囲,データ形式に気をつけてプログラムをつくってあげるといいと思います。

そうですね。

> ではでは,がんばって下さい。

ガンバリマッス ^_^;

     [このページのトップへ]


343. Re^3: 統計プログラムを書いていて変なことがあったので  ふむふむ  2000/12/14 (木) 12:47

> 他の人に聞いてみました。その人はWIndowsユーザなんですが,Windows版だとちゃんと動くそうです。
> 書くのを忘れていましたが,私はMacintoshを使っています。結局,Macintosh版にバグがあるようです。

Mac版のexcel の全ての版にバグがあるのですか?責任をもって言える(?)というのはいいすぎかな。確認した版をはっきりさせてください。

     [このページのトップへ]


344. Re^4: 統計プログラムを書いていて変なことがあったので  トマト  2000/12/14 (木) 13:29
> Mac版のexcel の全ての版にバグがあるのですか?責任をもって言える(?)というのはいいすぎかな。確認した版をはっきりさせてください。

ご自分の使っているものでちゃんと動いていればいいでしょう?
それとも,あなたはMS関係者でしょうか(^_^;)

それに,「ようです」と書いています。
Macintosh の場合は,システム機能拡張にどのようなものが入っているかなどにより,同じ版でちゃんと動いたり動かなくなったりすることもあるのは知っています。そのような場合には当該ソフトは問題ないのに,他の要因で問題が起こることもあります。

確認したのは
  Excel:mac 2001
  Microsoft(R) Excel 2001
  (C)1985-2001 Microsoft Corporation
というやつですね。
Excel 98 (Macintosh 版)では問題なく動きました。

     [このページのトップへ]


287. Re: 統計プログラムを書いていて変なことがあったので  ふむふむ  2000/12/07 (木) 12:37
私のところの excel 97 では n=171のときに同時にエラー(#VALUE!)になります。

     [このページのトップへ]


288. Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:13
> 私のところの excel 97 では n=171のときに同時にエラー(#VALUE!)になります。

8バイト実数の計算でオーバーフローするからです。
fact(171) は #NUM! を返します。

     [このページのトップへ]


286. Re: 統計プログラムを書いていて変なことがあったので  さかぐち  2000/12/07 (木) 09:15
> ...
> n=50 のときに
> fact(50)= 3.041409320171340E+64
> aaa(50) = 3.041409320171340E+64
> bbb(50) = #VALUE!
> となるのはなぜなんでしょうか.

私のところではbbbもaaaと同じになります。
環境はExcel2000です。

     [このページのトップへ]


289. Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:16
私のところではbbbもaaaと同じになります。
> 環境はExcel2000です。

Excel 2001 では,トマトさんと同じになりました。
Excel 98 では,aaa,bbb ともにちゃんと計算できます。
2001から変なことになったのかもしれませんね。

     [このページのトップへ]


284. Re: 統計プログラムを書いていて変なことがあったので  ひの  2000/12/07 (木) 00:31
> Excel の VBA で階乗を計算する関数を定義するとき,再帰関数 bbb(n) とループによる aaa(n) で,

VBAは使ったことがないのでですが,再帰で死ぬのはスタックが不足するからかもしれませんね。
それよりExcelには階乗関数は標準で用意されているのに何でそんな無駄なことをしているのでしょうか?超幾何分布とか結構マニアックな関数も用意されていますね。

     [このページのトップへ]


291. Re^2: 統計プログラムを書いていて変なことがあったので  名無しさん  2000/12/07 (木) 14:19
> VBAは使ったことがないのでですが,再帰で死ぬのはスタックが不足するからかもしれませんね。

あれくらいでスタックが不足するとは,MS恐るべし。

> それよりExcelには階乗関数は標準で用意されているのに何でそんな無駄なことをしているのでしょうか?

実行例に fact(50) の結果も挙げてあるので,承知の上でやっているのでは?
それとも,MSが信用できないとか。
あるいは,授業の課題だとか。
プログラムの練習だとか。
無用の用というやつかもしれません。

     [このページのトップへ]


● 「統計学関連なんでもあり」の過去ログ--- 011 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る