トップ回答者
VBのRATE関数の反復計算の手法について

質問
回答
すべての返信
-
こんにちは。フォーラムオペレーター高橋です。
確認なのですが、choucnさんが作ったJAVAのRATE関数で値の1.0E-7に収束していなかったケースがあったという認識でよいですか?
同じケースでVBのRATE関数を使った場合は、どのような結果になりましたか?VBのヘルプを確認したのですが、Rate関数が反復計算を 20 回行っても適切な解が見つからない場合は、エラーとなります。
もし、JAVAとVBで同じ結果になるのであれば、VBのRATE関数と同じように、エラーを返すという方法でも良いと思います。
http://msdn.microsoft.com/ja-jp/library/2kfcw15e.aspx違う結果の場合、GX999さんが紹介してくれたサンプルでは、どのような結果になるか試されてはどうですか?
今回、GX999さんから頂いた情報が有用な情報であったため、勝手ながら回答マークを付けさせて頂きました。
不適切な場合は、回答マークを削除する事も可能ですので、そのときはよろしくお願いします。今後ともMSDNフォーラムをよろしくお願いします。
マイクロソフト株式会社 フォーラム オペレータ 高橋春樹 -
おはよございます。チョウです。
ご回答の皆さんありがとうございます。
以下のパラメータでVBとJAVAで異なる結果になっています。
期間:12回
定期支払額:-5000円
現在価値(借入額):10000円
将来価値:0円
支払期日:0
推定値:0.1
VB結果:#NUM!
JAVA結果:-1.87813468165738
推定値が03に変更して以上の結果と同じです。
ただし、推定値が0.5に変更して、
VB結果:0.496021531967582
JAVA結果:0.496021531967577
ほぼ同じ結果になります。これはOKです。
推定値が0.1の場合、同じ結果が出てほしいですが、何かアドバイスを
いただけませんか。 -
VB6とVB.NETでさらにテストしましたが、結果は以下の不一致ケースがありました。
ケース①
期間:24回
定期支払額:-20000000円
現在価値(借入額):10000000000円
将来価値:0円
支払期日:0
推定値:0.3
VB6結果:例外発生
VB.NET:-0.169238909847223
ケース②
期間:36回
定期支払額:-20000000円
現在価値(借入額):10000000000円
将来価値:0円
支払期日:1
推定値:0.5
VB6結果:-0.108173999501872
VB.NET結果:例外発生
この不一致はどの原因でしょうか。よろしくお願いいたします。 -
VB6とVB.NETでさらにテストしましたが、結果は以下の不一致ケースがありました。
ケース①
期間:24回
定期支払額:-20000000円
現在価値(借入額):10000000000円
将来価値:0円
支払期日:0
推定値:0.3
VB6結果:例外発生
VB.NET:-0.169238909847223
ケース②
期間:36回
定期支払額:-20000000円
現在価値(借入額):10000000000円
将来価値:0円
支払期日:1
推定値:0.5
VB6結果:-0.108173999501872
VB.NET結果:例外発生
この不一致はどの原因でしょうか。よろしくお願いいたします。
私の検証では、ケース1の場合、-0.177530903320323となりましたが。
例外が発生している場合、引数に問題があります。ExceptionのMessageを見てみたところ、やはり「指定された引数を使って割合を計算することはできません。」とあります。Rate関数を呼び出す前に値が妥当な範囲に収まっているのか、検証しなければならないのではないでしょうか?
VB.NETの場合、Rate関数の第5引数はDueDate型であり、この指定が間違いやすいです。 -
同じパラメータで、VB6、VB.NETで計算された結果が異なります。
それはVB6かVB.NETかの計算精度の問題なのか。
パラメータ
期間: 60回
定期支払額: -9000000円
現在価値(借入額): 86420000円
将来価値: 20000円
支払期日: 1
推定値: 0.1(0.3, 0.5)
VB.NET結果: 0.11607051273018 (0.11607051273018, 0.11607051273018)
VB6結果:引数不正の例外が発生
また、Rate関数はdoubleを使っていますが、doubleの精度に問題があるでしょうか。