多倍長 無言に繋がる 数列の 干し草尽きて Segfault
どうも、ここ最近一日当りに消費する意識量が明らかに不足しているjouzimaです。
ええと先週、今週の実験の課題が「高精度演算」と題して、円周率を小数第百位だか千位ぐらいまで求めるプログラムを書くのですが、昨日今日でとりあえずの部分までは書き上げてしましました。
なぜだかは分りませんが、コンパイラによって動いたりダメだったり*1しています。
動くもの
動かないもの
- gcc4.3.2 on Linux 32bit
- gcc4.1.2 on Linux 32bit
- gcc4.3.2 on Cygwin 32bit
- Visual Studio8.0及び9.0 32bit
まだ次の実験まで時間があるので、のんびりと対応策を考えたいと思います。
追記
gdbでおっかけてみたところ、停止しない場合は、#defineマクロが無限ループになっているだけでしたが、セグメンテーション違反の方は多倍長数を計算する関数でアクセス違反がおこっているようです。
追記2
Visual Stdioのデバッガでおいかけたところ、話題のマクロが配列を破壊していたようです。
64bitで正常に動作したのは、最適化のために64bitコンパイラが配列のサイズを変更したからどと思われます。
gccのバージョンによる変化はおそらく、バージョンによって配列のマージンの取り方が変更になったからだと思います。
ただし、本当にそうなのか検証実験もしていませんし、変更があったかも調べていません。すべて憶測です。
追記3
マクロのバグはただ単に、forループの条件式にいらない'='があっただけでした。
おさわがせしてもうしわけありませんでした。
*1:停止しないか、セグメンテーション違反で強制終了