ワンライナーC関数がありreturn value * pow(1.+rate, -delay);
ます。これは、将来価値を現在価値に割り引くものです。分解の興味深い部分は
0x080555b9:neg%eax 0x080555bb:プッシュ%eax 0x080555bc:fildl(%esp) 0x080555bf:lea 0x4(%esp)、%esp 0x080555c3:fldl 0xfffffff0(%ebp) 0x080555c6:fld1 0x080555c8:faddp%st、%st(1) 0x080555ca:fxch%st(1) 0x080555cc:fstpl 0x8(%esp) 0x080555d0:fstpl(%esp) 0x080555d3:0x8051ce0に電話 0x080555d8:fmull 0xfffffff8(%ebp)
この関数をシングルステップで実行している間、gdbは次のように述べています(レートは0.02、遅延は2です。スタックで確認できます)。
(gdb)si 0x080555c630戻り値*pow(1. + rate、-delay); (gdb)info float R7:有効な0x4004a6c28f5c28f5c000 +41.68999999999999773 R6:有効な0x4004e15c28f5c28f6000 +56.34000000000000341 R5:有効な0x4004dceb851eb851e800 +55.22999999999999687 R4:有効な0xc0008000000000000000 -2 => R3:有効な0x3ff9a3d70a3d70a3d800 +0.02000000000000000042 R2:有効な0x4004ff147ae147ae1800 +63.77000000000000313 R1:有効な0x4004e17ae147ae147800 +56.36999999999999744 R0:有効な0x4004efb851eb851eb800 +59.92999999999999972 ステータスワード:0x1861 IE PE SF TOP:3 コントロールワード:0x037f IM DM ZM OM UM PM PC:拡張精度(64ビット) RC:最も近い値に丸める タグワード:0x0000 命令ポインタ:0x73:0x080555c3 オペランドポインタ:0x7b:0xbff41d78 オペコード:0xdd45
そして後fld1
:
(gdb)si 0x080555c830戻り値*pow(1. + rate、-delay); (gdb)info float R7:有効な0x4004a6c28f5c28f5c000 +41.68999999999999773 R6:有効な0x4004e15c28f5c28f6000 +56.34000000000000341 R5:有効な0x4004dceb851eb851e800 +55.22999999999999687 R4:有効な0xc0008000000000000000 -2 R3:有効な0x3ff9a3d70a3d70a3d800 +0.02000000000000000042 => R2:特殊0xffffc000000000000000実数不定(QNaN) R1:有効な0x4004e17ae147ae147800 +56.36999999999999744 R0:有効な0x4004efb851eb851eb800 +59.92999999999999972 ステータスワード:0x1261 IE PE SF C1 TOP:2 コントロールワード:0x037f IM DM ZM OM UM PM PC:拡張精度(64ビット) RC:最も近い値に丸める タグワード:0x0020 命令ポインタ:0x73:0x080555c6 オペランドポインタ:0x7b:0xbff41d78 オペコード:0xd9e8
この後、すべてが地獄に行きます。物事はひどく過大評価または過小評価されているので、私のfreeciv AIの試みに他のバグがなかったとしても、それはすべての間違った戦略を選択するでしょう。軍全体を北極圏に送るようなものです。(ため息をつく、もし私がそこまで到達していれば。)
fld1
何か明らかなものが欠けているか、何かに目がくらんでいるに違いありません。それが失敗する可能性があるとは信じられないからです。ほんの一握りがこの関数を通過した後にのみ失敗するはずです。以前のパスでは、FPUは1をST(0)に正しくロードします。0x080555c6のバイトは確実にエンコードされfld1
ます-実行中のプロセスでx/...でチェックされます。
何が得られますか?