teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

訂正

2017/01/28 05:07

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -7,4 +7,12 @@
7
7
 
8
8
  典型的なPCの環境ではintは32bit, doubleは64bit(IEEE形式)になると思いますが、taylor.cのコンパイル時にfcntlの戻り値が「intである」という間違った仮定でネイティブコードが生成されると、fctrlが本来返しているdouble型の値とは全然違う値をtaylor関数で受け取ってしまい、その値に基づいて計算した結果おかしな値になってしまったのでしょう。
9
9
 
10
- ご質問のコードではテイラー展開の計算を再帰的アルゴリズムで行っています。計算誤差が一定以上の間、テイラー展開式の項数を増やしながら誤差が減っていくことを期待したプログラムなのですが前述のバグによって値が収束しないため項数nがどんどん巨大になってしまいある時点でスタックオーバーフローを起こしsegmentation violationが発生したのだと思います。
10
+ ご質問のコードではテイラー展開の計算を再帰的アルゴリズムで行っています。計算誤差が一定以上の間、テイラー展開式の項数を増やしながら誤差が減っていくことを期待したプログラムなのですが前述のバグによって値が収束しないため項数nがどんどん巨大になってしまいある時点でスタックオーバーフローを起こしsegmentation violationが発生したのだと思います。
11
+
12
+ ---
13
+
14
+ 訂正:
15
+ 上の回答間違ってました。
16
+ fctrlは標準ライブラリーのfctrlの方がが呼ばれちゃったんですね・・・標準ライブラリーの方のfctrlが正しくない引数で呼び出されたために異常終了したんだと思います。
17
+ できるだけ標準ライブラリーに存在する関数名を使わないように注意できるといいかも知れませんね。例えば階乗はfactorialにしておくとか。(factorialもあったりして・・・)
18
+