[過去ログ]
Visual Studio 2008 Part 22 (314レス)
Visual Studio 2008 Part 22 http://mevius.5ch.net/test/read.cgi/tech/1413180800/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
208: デフォルトの名無しさん [sage] 2018/09/16(日) 08:29:03.14 ID:zL1WUjLu >>194 FPU control registor については何故か安定した結果を得られていない。 インラインアセンブラは以下の通りで、 #pragma unmanaged inline void fpu_getcw(unsigned short* cw) { __asm{ fnstcw [cw]; } } #pragma managed これを norm = calc_norm_and_regulate( ... ) の直前/直後に配置して読み出し、 同様にコンソール出力すると、以下となる。 また、IDEで起動した場合は、「レジスタ」で見れる。 なお定義は以下の通り。 [9:8]に対し、 0x00 : 単精度(24bit) 0x01 : reserved 0x10 : 倍精度(53bit) 0x11 : 拡張倍精度(64bit) [11:10]に対し 0x00 : 最近値 0x01 : 切り捨て 0x10 : 切り上げ 0x11 : 0方向への切り捨て http://mevius.5ch.net/test/read.cgi/tech/1413180800/208
209: デフォルトの名無しさん [sage] 2018/09/16(日) 08:29:57.53 ID:zL1WUjLu >>194 直後のみに配置: 0x027F (倍精度) = Debug(IDE起動)のIDE内表示、Release(IDE起動)のIDE内表示、 0x03a5 (拡張倍精度) = Debug(IDE起動)、Release(IDE起動)、 0x3fdc (拡張倍精度) = Debug(コマンドプロンプト)、 0xf280, 0xf290, 0xf160, 0xf010等、不安定 = Release(コマンドプロンプト) 直前のみに配置: 直後のみと同じ結果。(つまり『何故か』安定している) Release(コマンドプロンプト)は不安定なのも同じ。 直前と直後に配置: 直前側は当然不安定になる。 直後側は「直後のみ」の結果と同じ。(Release(コマンドプロンプト)は不安定なのも同じ) 雰囲気からすると、IDE内表示は当てにならず、 命令自体は rdtsc と同じで非同期に実行されている雰囲気だが、 rdtsc命令の注意書きにある「シリアル化命令ではない」という但し書きが無く、状況は不明。 正直、正しく読み出せているか怪しい。(あてにならない) これらから推測すると、暫定的には以下。 拡張倍精度 = Debug(IDE起動)、Release(IDE起動)、Debug(コマンドプロンプト)、 不明 = Release(コマンドプロンプト) 以上が>>194その他に対する回答。 これから>>198その他について確認する。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/209
210: デフォルトの名無しさん [sage] 2018/09/16(日) 12:52:37.56 ID:haV9TZ8e >>209 興味深い結果だ。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/210
211: デフォルトの名無しさん [sage] 2018/09/16(日) 13:21:26.16 ID:haV9TZ8e >>209 >命令自体は rdtsc と同じで非同期に実行されている雰囲気だが、 >rdtsc命令の注意書きにある「シリアル化命令ではない」という但し書きが無く、状況は不明。 >正直、正しく読み出せているか怪しい。(あてにならない) インラインアセンブラを使わずに、 _control87(), _controlfp() : Get and set the floating-point control word. unsigned int _control87( unsigned int new, unsigned int mask ); unsigned int _controlfp( unsigned int new, unsigned int mask ); を使ってみたらどうなる? http://mevius.5ch.net/test/read.cgi/tech/1413180800/211
212: デフォルトの名無しさん [sage] 2018/09/16(日) 13:31:15.50 ID:Q5j4SiHR win32コンソールなら結果が同じ。 もう理由は分かったのに何が問題なんだ?こんなの何の影響もないだろう。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/212
213: デフォルトの名無しさん [sage] 2018/09/16(日) 13:33:14.92 ID:zL1WUjLu >>198 再現実験ありがとう。 しかし色々問題がある。 1. 俺は起動方法による違いについてフォーカスしているが、 君はRelease/Debugの違いにフォーカスしている。 2. VC++2008では再現しない。(VC++2010では再現する) 3. ソース改変しすぎ。それでは意味がない。 4. >>206の結論は間違い。 まず問題なのはソースの改変だ。 ループ回数を16回と決め打ちしたことで 8*2 に展開されている。 その結果、元のソース(俺が遭遇した状況)では発生しえないことが発生している。 これでは意味がない。 そして、君の結論は間違いだ。 × > ウンコみたいな最適化で演算の順序が入れ替わったせいで、誤差が発生しているものと考えられる 逆アセンブルを追えば分かるが、演算順序は入れ替わっていない。 原因は、Debugでは fld/fmul/fadd/fstp と毎回64bitに整形されるのに対し、 Releaseでは (fld/fmul/fadd)*8 + fstp と整形が8回に1回と減り、 8回は80bit(拡張倍精度)で演算されるからだ。 (こうなったのは君が16回ループ決め打ちコードに改変したから) ただしIDE上の fpu control registor の値は 相変わらず0x027F(倍精度)となっており、 IDEのこの表示が当てにならない事は分かる。 なおVC++2008では再現しなかった。 俺の環境では、16回決め打ちコードでも 8*2 に展開されず、Debugと同じコードだからだ。 勿論結果も同じだった。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/213
214: デフォルトの名無しさん [sage] 2018/09/16(日) 13:33:48.22 ID:zL1WUjLu >>198 問題は、俺の環境で俺が提供したコード>>191だと、 同様に展開されないにも関わらず、『起動方法によって』結果が異なってしまう点だ。 俺の環境でのRelease/Debugの逆アセンブル結果のdiffは以下。 17c17 < 0000000c cmp dword ptr ds:[001C2E14h],0 --- > 0000000c cmp dword ptr ds:[00702E14h],0 19c19 < 00000015 call 68302BA9 --- > 00000015 call 683A5AB1 93c93 < 0000015a call FF6C3098 --- > 0000015a call FFCA57E8 98c98 < 0000016f push 0B5311Ch --- > 0000016f push 0D03188h 104,105c104,105 < 00000183 push 4F9D68h < 00000188 call FF6C30A4 --- > 00000183 push 2B71C0h > 00000188 call FFCA57F4 アドレスの変更だけであり、君の結果 「ループ回数を決め打ちしたことによりアンローリングされ、一部の演算がx87精度で計算される」には該当しない。 そして、この状況でも結果が異なってしまうことが問題なのだ。 君は君が勝手に新しく作り込んだ問題に対し、間違った結論でお茶を濁したにすぎない。 君が知っているFPU関連のことはこちらも知っている上で、質問している。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/214
215: デフォルトの名無しさん [sage] 2018/09/16(日) 13:53:17.67 ID:haV9TZ8e >>213 なるほど、全く別の2つの理由で、精度が変わっている可能性(というより多分、確実)があると。 それは以下の2つ: 1. Debug版とRelease版では、最適化の結果、x87 FPU命令の使われ方が変わる。 x87では、メモリに書き戻さずに st(0)〜st(7)レジスタに入っている途中では、 拡張倍精度の80BITで計算されるが、書き戻すとdoubleの場合でも64BITに丸め られる。なるべくメモリに書き戻さずにレジスタった方が高速なので、Release版 では、80BITで計算される「期間」が多くなる。そのため、Debug版とRelese版では 結果が僅かに違ってくる。 2. fpu control word が違っていて、st(0)〜st(7)に入っていても、計算が 80BITか、64BIT、32BITのどれで計算されるか異なったり、丸め方が四捨五入 か、正負二種類の方向の切り捨てなどが変わっている。 そして、IDEから起動した場合と、コマンドラインから起動した場合で結果が違う のは、「2.」の理由によるものではないかと。そして、実際に、インラインアセンブラ で fpu control word を読み取ってみると、不安定な値が読み出されたと。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/215
216: デフォルトの名無しさん [] 2018/09/16(日) 13:58:15.86 ID:haV9TZ8e まず、 __asm{ fnstcw [cw]; } ではなく、_control87() を使ってみて欲しい。 インラインアセンブラは、独立した *.asm で書くより危険な場合が あるかも知れないので。特にC関数の引数、今の場合は、「cw」を インライン・アセンブラで用いた場合、正しいコードが出ているかどうか は注意が必要。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/216
217: デフォルトの名無しさん [sage] 2018/09/16(日) 14:05:28.41 ID:haV9TZ8e >>208 よく見ると、それは、かなり複雑な事情が絡みそうなコード。 以下のようにした方が安心。なお、「cw」という短すぎる引数名 も長年のプログラミング経験からすると、インラインアセンブラでは 怖い。また、 TTTT reg,引数名 や TTTT 引数名 は大丈夫でも、 TTTT reg,[引数名] や TTTT [引数名] は1命令では不可能な事をコンパイラに指示している事になるので ちょっと怖い。間接の間接、つまり、[[ebp+8]]みたいな事を要求 しているが、そんなオペランドが使えるアセンブリ命令はx86/x64 では存在しないので。 #pragma unmanaged inline void fpu_getcw(unsigned short *pCW) { __asm{ mov edx,pCW fnstcw [edx]; } } #pragma managed http://mevius.5ch.net/test/read.cgi/tech/1413180800/217
218: デフォルトの名無しさん [sage] 2018/09/16(日) 14:17:40.34 ID:haV9TZ8e あ、後、インライン・アセンブラで実験する場合は、関数名の inline は 「取った」方がいい。つまり、以下の方が安心: #pragma unmanaged void fpu_getcw(unsigned short *pCW) { __asm{ mov edx,pCW fnstcw [edx]; } } #pragma managed http://mevius.5ch.net/test/read.cgi/tech/1413180800/218
219: デフォルトの名無しさん [sage] 2018/09/16(日) 15:23:18.78 ID:h8nMbN0G また基本に戻るが、>>192で/MDになってるので /MTや/MTdでも発生するかしてみた方がいい http://mevius.5ch.net/test/read.cgi/tech/1413180800/219
220: デフォルトの名無しさん [sage] 2018/09/16(日) 15:37:02.44 ID:Q5j4SiHR .netはx87コンテキストをすべて保持しませんって分かったんだからもう十分。 win32かx64にすれば解決。そもそも問題になる仕様バグじゃない。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/220
221: デフォルトの名無しさん [sage] 2018/09/16(日) 15:40:56.17 ID:haV9TZ8e >>219 ホントだ。/MDだと、Runtime Library として DLL のものを使ってしまう。 これは、今回の現象に非常に重要な影響を与えているかも知れない。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/221
222: デフォルトの名無しさん [sage] 2018/09/16(日) 15:42:36.82 ID:haV9TZ8e >>220 いや、まだまだ興味深い。 ここで終わらせずにもっと徹底して追及すべきだ。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/222
223: デフォルトの名無しさん [sage] 2018/09/16(日) 15:48:45.63 ID:zL1WUjLu >>211 それはどうやらclrでは使えないらしい。 > These functions are ignored when you use /clr (Common Language Runtime Compilation) or /clr:pure to compile > because the common language runtime (CLR) only supports the default floating-point precision. > https://msdn.microsoft.com/en-us/library/e9b52ceh.aspx とはいえ無理矢理やってみた。警告は出るがコンパイルは通る。 結果は、どこに置いても、Debug/Releaseでも、常に 0x9001f が読み出される。 ただし、これは上記の仕様からして、当てにならない。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/223
224: デフォルトの名無しさん [sage] 2018/09/16(日) 15:49:44.99 ID:zL1WUjLu >>218 218のコードで試してみた結果、209で言った不安定さはなくなり、 全てにおいて 0x027f が安定して読み出せるようになった。 ただしその過程で気づいたが、 IDEから起動した場合はReleaseビルドであっても、「未初期化のスタック値」も0x00が読み出せるようだ。 どうやらこれが原因の可能性が出てきた。(はっきり言って俺のバグだが) コードは以下の通りだが、 unsigned short fpu_cw, fpu_cw_after; // fpu_getcw(&fpu_cw); double norm = calc_norm_and_regulate(count, inputs, false); fpu_getcw(&fpu_cw_after); Console::Write(String::Format("{0:D}, 0x{0:x4}\r\n",fpu_cw)); Console::Write(String::Format("{0:D}, 0x{0:x4}\r\n",fpu_cw_after)); 読み出しと書き出し(Console::Write)を両方ともコメントアウトするのが面倒なので、 色々試す際、読み出しだけコメントアウトし、不定を表示させて脳内で省略していたのだが、 IDEから起動した場合はReleaseビルドであっても必ず0x0000が表示される事に気づいた。 上記『初期化していない』 fpu_cw を Releaseビルドをコマンドプロンプトから実行: 不定 ReleaseビルドをIDEから実行: 常に0x0000 となる。 実行前にあらかじめスタック領域を0fillでもしているのか? まあこれに当たっているのなら確実に俺のバグだし、これなら辻褄は合ってしまうのだが。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/224
225: デフォルトの名無しさん [sage] 2018/09/16(日) 15:51:01.50 ID:zL1WUjLu >>218 なお、逆アセンブルでコードバイトを表示させて確かめることは出来る。 正しいコードは出ている。(ただし不安定) inline void fpu_getcw(unsigned short* cw) { 00DA1540 55 push ebp 00DA1541 8B EC mov ebp,esp __asm{ fnstcw [cw]; 00DA1543 D9 7D 08 fnstcw word ptr [cw] } } 00DA1546 5D pop ebp 00DA1547 C3 ret fnstcwは D9 /7 で 7D なら [EBP+disp8] となり、 7D 08 は [EBP+08] となる。 つまりスタックポインタ+8の領域に書き戻せ、となる。 [ebp+0]は元のebpが入っているから、(pushしているので) [ebp+4]にcallの戻り値アドレス [ebp+8]にcw(第一引数)が入っていることになる。 これは正しいコードだ。 しかし再度試したが、確かに不安定だ。何故かは分からん。 inline取ってみても不安定のまま。 > そんなオペランドが使えるアセンブリ命令はx86/x64 > では存在しないので。 正直、/7の意味が分からないのだが、説明は > /digit − 0 から7 までの数字で、命令のModR/M バイトがr/m(レジスタまたはメモリ)オペランドだけを使用することを示す。 > reg フィールドには、命令のオペコードを拡張する数字が入っている。(Intelのマニュアルより) となっているのだが、これはどういう意味だ? ModR/Mバイトが全部使えるとすると [ebp+disp8]出来ることになる。そしてそのコードは出ている。 ただし、動作は怪しいのも事実。 ModR/Mの一部しか使えない、ということか? http://mevius.5ch.net/test/read.cgi/tech/1413180800/225
226: デフォルトの名無しさん [sage] 2018/09/16(日) 15:51:25.16 ID:zL1WUjLu >>218 218のコードだと、 00381002 EC in al,dx __asm{ mov edx,pCW 00381003 8B 55 08 mov edx,dword ptr [pCW] fnstcw [edx]; 00381006 D9 3A fnstcw word ptr [edx] } } 00381008 5D pop ebp 00381009 C3 ret D9 3A ならまんま fnstcw [edx] だ。 理由は分からんがこちらだと安定しているので、結果としてはこのやり方が正しい。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/226
227: デフォルトの名無しさん [sage] 2018/09/16(日) 16:02:47.64 ID:haV9TZ8e >>225 をを。やはり、ある意味ではVCが間違ったアセンブリコードを出していたよ。 それだと、 fnstcw [EBP+08] という意味になってしまって、 fnstcw pCW の意味になっている。つまり: pCW = control_word; あなたが、やりたいのは、 *pCW = control_word; だったのだから、アセンブリ・コードが間違ってる。 あなたが指示したのは、 fnstcw [pCW] だった。実際に生成されたコードは、 fnstcw pCW だった。 VC のインラインアセンブラは、エラーも出さずに間違ったコードを 出すことが証明された。 これと、精度が不安定な問題とは全く別ではあるけれど。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/227
228: デフォルトの名無しさん [sage] 2018/09/16(日) 16:06:05.39 ID:zL1WUjLu すまん、間違いの修正 >>224 × > どうやらこれが原因の可能性が出てきた。(はっきり言って俺のバグだが) × > まあこれに当たっているのなら確実に俺のバグだし、これなら辻褄は合ってしまうのだが。 今回は俺はあくまで俺の本番コードのデバッグを念頭に置いていて、この発言だった。 ただし>>191の再現コードで『不定スタック領域』を掴んでいるわけもなく、 一応IDE起動とコマンドプロンプト起動での挙動の違いを再現出来ているわけだから、 これだけが問題ではないのも事実だ。 俺にとっては一つ新しい知見として、 ・IDEから起動した場合、スタックが初期化されるっぽい ということが分かった。とはいえOSは0fillしてから各プロセスにメモリを与えるので、実際は、 ・コマンドプロンプト起動ならmain前に設定した続きでそのまま実行、 ・IDE起動ならmain前に色々やって0fillして実行、 或いはmain前に色々やることが多く、スタックが進み、(例えばデバッガをアタッチする為) 結果的にOSが初期化済みの領域から始動 となって違いが発生するというところか。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/228
229: デフォルトの名無しさん [sage] 2018/09/16(日) 16:11:52.18 ID:haV9TZ8e >>225 >正直、/7の意味が分からないのだが、 ModRM とは、 mod reg r/m 76 543 210 のようなオペランドを指しているのだけど、/7 は、regの部分を2進数の111、 10進数の「7」にするという意味。このタイプのマシン語は、 mod ttt r/m とも書かれる。tttの部分は、命令の主幹部分(ニモニック部分)によって変わる。 普通は、レジスタ番号を入れるところに、命令の種類を表す3BITの値を入れる 仕様になっている。 あなたがインラインアセンブラでVCに出させたかったコードは、意味的には、 fnstcw [[EBP+08]] なのだが、[ ] を二重にしたようなそんなx86/x64命令は存在しないので VC がエラーも出さずに勝手に一重の fnstcw [EBP+08] にしてしまった、という事。本当は、 mov edx,[EBP+08] fnstcw [edx] というコードにしなくてはならなかったのに、VCがある意味では間違った。 これが、単独の *.asm ではなく、VC の asm {・・・} が危険な理由。 VC の asm は特に危険。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/229
230: デフォルトの名無しさん [sage] 2018/09/16(日) 16:17:02.07 ID:haV9TZ8e >>228 >ただし>>191の再現コードで『不定スタック領域』を掴んでいるわけもなく、 >一応IDE起動とコマンドプロンプト起動での挙動の違いを再現出来ているわけだから、 >これだけが問題ではないのも事実だ。 そうだよ。精度が変わるのはあなたの間違いではない。スタック領域が0クリア されようがれまいが、あなたのコード自体には特に不安定さはない。 非初期化領域を参照しているコードは見当たらないし。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/230
231: デフォルトの名無しさん [sage] 2018/09/16(日) 16:20:22.27 ID:haV9TZ8e 逆アセンブラ結果を見てないで言うけど、もし、sqrt() が call文で関数呼び出し されているんだったら、そこで精度の違いが出てるかもしれない。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/231
232: デフォルトの名無しさん [sage] 2018/09/16(日) 16:23:20.75 ID:zL1WUjLu >>227 なるほど、了解した。 つまり、>>209は全面的に間違いで、正しくは、 ・fpu control register は 0x027F で、IDEからも正しく読めている だな。 俺がやるべきだったのは fnstcw [[cw]] なのだと思うが、これはSyntaxErrorだ。 そして、こんな命令はないから、 []内に変数を書かず、レジスタ名にしろ、ということだったのだな。 全くもって了解だ。 VCの問題ではなくて、 俺が fnstcw [cw] と書いたのが間違いで、それをそのままコードにされてしまっただけだな。 正しく書けばSyntaxErrorだったのだし。 なお fnstcw [*cw] もSyntaxErrorだ。手動で一旦レジスタに移さないと駄目だな。 全くもって>>218のコードが正しい。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/232
233: デフォルトの名無しさん [sage] 2018/09/16(日) 16:35:08.59 ID:LrdaMWHl >>232 >俺がやるべきだったのは fnstcw [[cw]] なのだと思うが、これはSyntaxErrorだ。 ちょっと違う。あなたはやるべきことをちゃんと正しく、 fnstcw [cw] と書いた。しかし、cw=[ebp+8]なので、これは、 fnstcw [[ebp+8]] という「意味」になる。でも、x86/x64のマシン語にはこんな[ ]を二重にした オペランドは存在しないので、VCが無断で勝手に[ ]を一重にして、 fnstcw [ebp+8] に改変してしまった。 **(ebp+8) = control_word; としなくてはならないのに、VCが勝手に、 *(ebp+8) = control_word; としたということ。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/233
234: デフォルトの名無しさん [sage] 2018/09/16(日) 16:36:04.13 ID:zL1WUjLu >>229-230 了解だ。ありがとう。 >>231 その部分の逆アセンブラは以下の通り。 普通にcallされている。(行数オーバーなので切るが) ただし、 > そこで精度の違いが出てるかもしれない との繋がりがよくからない。 sqrt()でcallされると、スタックが改変される。おそらくデータ依存か? なら未初期化のスタックを掴みに行っているコードが有ればバグる。 ただし今回の『再現コード』はこの限りではない。 (俺の本番コードはさておき) http://mevius.5ch.net/test/read.cgi/tech/1413180800/234
235: デフォルトの名無しさん [sage] 2018/09/16(日) 16:37:19.30 ID:zL1WUjLu >>231 逆アセンブラ for (int i=0;i<num;i++) norm += (double)r[i] * (double)r[i]; 00000033 33 D2 xor edx,edx 00000035 89 55 E8 mov dword ptr [ebp-18h],edx 00000038 90 nop 00000039 EB 03 jmp 0000003E 0000003b FF 45 E8 inc dword ptr [ebp-18h] 0000003e 8B 45 E8 mov eax,dword ptr [ebp-18h] 00000041 3B 45 FC cmp eax,dword ptr [ebp-4] 00000044 7D 1B jge 00000061 00000046 8B 45 F8 mov eax,dword ptr [ebp-8] 00000049 8B 55 E8 mov edx,dword ptr [ebp-18h] 0000004c DD 04 D0 fld qword ptr [eax+edx*8] 0000004f 8B 45 F8 mov eax,dword ptr [ebp-8] 00000052 8B 55 E8 mov edx,dword ptr [ebp-18h] 00000055 DC 0C D0 fmul qword ptr [eax+edx*8] 00000058 DC 45 F0 fadd qword ptr [ebp-10h] 0000005b DD 5D F0 fstp qword ptr [ebp-10h] 0000005e 90 nop 0000005f EB DA jmp 0000003B norm = sqrt(norm); 00000061 DD 45 F0 fld qword ptr [ebp-10h] 00000064 83 EC 08 sub esp,8 00000067 DD 1C 24 fstp qword ptr [esp] 0000006a E8 0D 50 7B FF call FF7B507C 0000006f DD 5D D8 fstp qword ptr [ebp-28h] 00000072 DD 45 D8 fld qword ptr [ebp-28h] 00000075 DD 5D F0 fstp qword ptr [ebp-10h] http://mevius.5ch.net/test/read.cgi/tech/1413180800/235
236: デフォルトの名無しさん [sage] 2018/09/16(日) 16:37:34.94 ID:zL1WUjLu >>231 逆アセンブラ(続き) if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); 00000078 0F B6 45 08 movzx eax,byte ptr [ebp+8] 0000007c 85 C0 test eax,eax 0000007e 74 25 je 000000A5 00000080 33 D2 xor edx,edx 00000082 89 55 EC mov dword ptr [ebp-14h],edx 00000085 90 nop 00000086 EB 03 jmp 0000008B 00000088 FF 45 EC inc dword ptr [ebp-14h] 0000008b 8B 45 EC mov eax,dword ptr [ebp-14h] 0000008e 3B 45 FC cmp eax,dword ptr [ebp-4] 00000091 7D 12 jge 000000A5 00000093 8B 45 F8 mov eax,dword ptr [ebp-8] 00000096 8B 55 EC mov edx,dword ptr [ebp-14h] 00000099 DD 45 F0 fld qword ptr [ebp-10h] 0000009c DC 3C D0 fdivr qword ptr [eax+edx*8] 0000009f DD 1C D0 fstp qword ptr [eax+edx*8] 000000a2 90 nop 000000a3 EB E3 jmp 00000088 return norm; 000000a5 DD 45 F0 fld qword ptr [ebp-10h] 000000a8 DD 5D E0 fstp qword ptr [ebp-20h] http://mevius.5ch.net/test/read.cgi/tech/1413180800/236
237: デフォルトの名無しさん [sage] 2018/09/16(日) 16:40:36.14 ID:LrdaMWHl >>234 よく見ると、最小(?)の実験コードでは sqrt() が使われていなかった。 スマン。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/237
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 77 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.018s