- 262 名前:デフォルトの名無しさん mailto:sage [2018/09/16(日) 22:33:32.07 ID:zL1WUjLu.net]
- >>253
そちらの逆アセンブルは以下の違いが出てるだろ。 static版: fld/fmul/fadd/fstp 非static版: fld/fmul/faddp (fstpが無い) この非static版の場合、拡張倍精度(80bit)で演算されるから精度が高いことになり、 static版との演算結果に違いが出るのも仕様通りなんだよ。(これは>>201と同じ間違い) 一応、fstpにも80bit版はあって、Intelのマニュアルによると以下。 > オペコード命令説明 > D9 /2 FST m32fp ST(0) をm32fp にコピーする。 > DD /2 FST m64fp ST(0) をm64fp にコピーする。 > DD D0+i FST ST(i) ST(0) をST(i) にコピーする。 > D9 /3 FSTP m32fp ST(0) をm32fp にコピーし、レジスタスタックをポップする。 > DD /3 FSTP m64fp ST(0) をm64fp にコピーし、レジスタスタックをポップする。 > DB /7 FSTP m80fp ST(0) をm80fp にコピーし、レジスタスタックをポップする。 > DD D8+i FSTP ST(i) ST(0) をST(i) にコピーし、レジスタスタックをポップする。 つまり君のstatic版 > 0000001f DD 1D 00 30 CC 00 fstp qword ptr ds:[00CC3000h] では FSTP /3 m64fp [disp32] であり、そこで64bit(倍精度)に丸められてる。 だからレジスタ(80bit=拡張倍精度)で演算される非static版と結果が異なる。 static版のsftpが DB /7 m80fp なら誤差は出ないはずなんだよ。(Cでどう書くのかは知らん) だから>>253の場合の誤差なら、仕様通りなんだよ。(片方が倍精度、もう片方は拡張倍精度) ただし、>>192は逆アセンブル(>>236)を見る限りそれに該当しないし、(両方とも倍精度) 今回の俺の上記逆アセンブル(>>254、中身は君の指摘通りunmanagedにしただけ)も該当しない。(両方とも倍精度) そして253は何故か直ってしまった。
|

|