- 整数オーバーフロー(数式処理)
どっちが正しいのか?
テンソル解析プリプロセッサをもう少し大きな整数演算でも耐えられるような数式処理機能に拡張しようと思いいわゆる多倍長整数演算系を作成した。検証に使った式とMathematicaの結果は
(35/128+(-3003/32*pow(x,6))+(-315/32*pow(x,2))+(6435/128*pow(x,8))+(3465/64*pow(x,4)))
と結果は一致している。これは改良前と(
少し大きな整数演算でも耐えられる)改良後でピッタリ一致している。
n=15
の場合は、
((-37182145/2048*pow(x,9))+(-35102025/2048*pow(x,13))+(-2909907/2048*pow(x,5))+ (-6435/2048*x)+(255255/2048*pow(x,3))+(9694845/2048*pow(x,15))+ (14549535/2048*pow(x,7))+(50702925/2048*pow(x,11)))
となるが、改良前の版では
((-60079/43008*pow(x,11))+(-50293/43008*pow(x,7))+(-16383/14336*pow(x,13))+ (-44573/43008*pow(x,3))+(-8437/14336*x)+(-5703/14336*pow(x,9))+ (-2965/14336*pow(x,15))+(12091/14336*pow(x,5)))
となって一致しない。「バグ」(後退!!)だ。ちょっといじりすぎた!!。しばらく色々とデバックして見たが誤りは見つけられなかった。そこでふと?思ったのは既に改良前の版では整数演算が既にパンクしていて間違った答えを出していたのでは?と思いMathematicaでチェックしてみた。
Mathematicaでは
なんだ、一致してるじゃないか!!。そう改悪(後退)になっていないかのチェックの時点ですでに元の照合すべき結果が間違っていたのだ。ちゃんと改良になってるじゃないか!!。そこでもう少しチェックして安心しておこう。
n=30の場合は
cは
WCCTLが出力した結果。Mathematicaとの結果の差はピッタリ、ゼロになっている。
|