[過去ログ]
Visual Studio 2008 Part 22 (314レス)
Visual Studio 2008 Part 22 http://mevius.5ch.net/test/read.cgi/tech/1413180800/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
175: デフォルトの名無しさん [sage] 2018/09/14(金) 17:48:23.40 ID:HVgt1gkj 浮動小数点の誤差を考慮に入れてないというイージーな仕様バグですね。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/175
176: デフォルトの名無しさん [] 2018/09/14(金) 21:39:03.40 ID:fXySkelb 再現するコードをみないとなにもわかるわけがない 低学歴知恵遅れが書くコードなんかなにをやってるか分からないからな ごちゃごちゃいってないで再現するコードをあげなさい http://mevius.5ch.net/test/read.cgi/tech/1413180800/176
177: デフォルトの名無しさん [sage] 2018/09/15(土) 06:26:55.94 ID:/OsufeBT 月並みな意見だけど、 「症状を再現できる最小のソースと初期データ、それとコンパイル環境」 まで切り詰めてみるのが早道じゃないかな。 ちょくちょく発生する事例なら、解決策を知ってる誰かが教えてくれてるかと。 週末、より多くの人が質問を見ることを期待して待つ手もあるけど。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/177
178: デフォルトの名無しさん [sage] 2018/09/15(土) 08:56:57.28 ID:9ZmI9OgI より基本に立ち返ろう そもそも誤差はあるのか? 計算結果を何を使ってどう出力しているかだけでもソースを見せてくれ http://mevius.5ch.net/test/read.cgi/tech/1413180800/178
179: デフォルトの名無しさん [sage] 2018/09/15(土) 13:36:34.65 ID:heijdb7v >>174 x87でも誤差を丸める方法を fpu control word で設定できる事は出来る。 四捨五入と切り捨てなどを切り替えられる。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/179
180: デフォルトの名無しさん [sage] 2018/09/15(土) 13:42:47.95 ID:heijdb7v fpu control word で、丸め方法と、精度の二つを独立に設定できる。 この精度の設定で、メモリ上の表現がdouble型でも、計算時のfpuの内部精度が変わってくる。 普通は64bit doubleに対して、fpu内部では80bitの精度で計算する。仮数部のbit数は、確か、それぞれ、53BIT、64BITだったかな。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/180
181: デフォルトの名無しさん [sage] 2018/09/15(土) 14:05:09.61 ID:heijdb7v Intel® 64 and IA-32 Architectures Software Developer’s Manual [Vol 1] 11.6.8 Compatibility of SIMD and x87 FPU Floating-Point Data Types SSE and SSE2 extensions operate on the same single-precision and double-precision floating-point data types that the x87 FPU operates on. However, when operating on these data types, the SSE and SSE2 extensions operate on them in their native format (single-precision or double-precision), in contrast to the x87 FPU which extends them to double extended-precision floating-point format to perform computations and then rounds the result back to a single-precision or double-precision format before writing results to memory. Because the x87 FPU operates on a higher precision format and then rounds the result to a lower precision format, it may return a slightly different result when performing the same operation on the same single-precision or double-precision floating-point values than is returned by the SSE and SSE2 extensions. The difference occurs only in the least-significant bits of the significand. http://mevius.5ch.net/test/read.cgi/tech/1413180800/181
182: デフォルトの名無しさん [sage] 2018/09/15(土) 14:14:58.92 ID:heijdb7v >>181 書いてある意味は、 「SSEやSSE2だと、float(32BIT)やdouble(64BIT)のまま計算するが、x87 fpuだと、もっと高い精度であるところの 『double extended-precision floating-point format(拡張倍精度浮動小数点フォーマット:80BIT)』 で計算を実行して、丸めてから、floatやdoubleに戻す。 そのため、SSE/SSE2 と x87 fpuでは結果が変わることがある。 しかし、その場合でも結果の違いは、仮数部の LSB (最も価値の小さいBIT)の1BITにだけ現れる。」 というような事。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/182
183: デフォルトの名無しさん [sage] 2018/09/15(土) 16:09:28.75 ID:aC3C7hdp 揚げ足取りだけどLSBを「最も価値が小さい」って直訳はいかがなものかなw 普通に最下位ビットじゃないの? ところで > the least-significant bits これ何で複数形なのかね http://mevius.5ch.net/test/read.cgi/tech/1413180800/183
184: デフォルトの名無しさん [] 2018/09/15(土) 16:14:15.89 ID:AVfR6YnT 2の0乗だから実際価値が低い 上はMVBで http://mevius.5ch.net/test/read.cgi/tech/1413180800/184
185: デフォルトの名無しさん [sage] 2018/09/15(土) 17:07:56.98 ID:UR1d6CKz >>182 ありがとう。 ただ一応それは知ってて、その上で、IDEの環境設定等を疑っている。 >>177 とはいえ地道に辿って、同様の再現コードを作ることに成功しそうだ。 もう少し調べて、多分今晩か明日午前中に上げる。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/185
186: デフォルトの名無しさん [sage] 2018/09/15(土) 17:12:32.47 ID:heijdb7v >>183 「The difference occurs only in the least-significant bits of the significand.」 これは、SSE の場合の LSB と、x87 FPU の場合の FPU の2種類を頭の中に想定していると思われる。 SSE: a1 = 1.xxxxxxxxz * 10^b x87 : a2 = 1.yyyyyyyyw * 10^c つまり、LSB は、↑のように、z と w で、2つあるので、LSBs という英語になる。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/186
187: デフォルトの名無しさん [sage] 2018/09/15(土) 17:15:04.14 ID:heijdb7v 誤:これは、SSE の場合の LSB と、x87 FPU の場合の FPU の2種類を 正:これは、SSE の場合の LSB と、x87 FPU の場合の 2種類を http://mevius.5ch.net/test/read.cgi/tech/1413180800/187
188: デフォルトの名無しさん [sage] 2018/09/15(土) 17:18:55.19 ID:heijdb7v >>183 >揚げ足取りだけどLSBを「最も価値が小さい」って直訳はいかがなものかなw >普通に最下位ビットじゃないの? 整数の場合は、「最下位ビット」というと、本当にBITの位置が一番右にあるようなイメージもある。 一方、浮動小数点数の場合は、右にあるとかより、仮数部において、一番価値の小さいビット、というニュアンスを使えたかった。 IEEEでは、それは確かに一番右にあるビットであって、マシン語レベルの表現では、BIT0ではあるのだが。 ニュアンス的に。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/188
189: デフォルトの名無しさん [sage] 2018/09/15(土) 17:29:56.92 ID:aC3C7hdp >>186 それは俺も思ったけど、それならsignificandの方も複数じゃないとおかしいような... http://mevius.5ch.net/test/read.cgi/tech/1413180800/189
190: デフォルトの名無しさん [sage] 2018/09/15(土) 20:35:40.44 ID:UR1d6CKz 同様の症状を再現出来るようになったので上げる。 完全再現は出来てないが、使い物にはなるはず。興味がある人はよろしく。 症状: 単独で起動した場合と、IDEから起動した場合で、結果が異なる。 環境: VS++2008ExpressEdition 再現方法: 1. 新規プロジェクトを作成。(CLRコンソールアプリケーション。オプション等は全てデフォのまま) 2. mainを以下ソースと差し替える。 3. Releaseビルドで実行する。(Debugビルドでは再現しなかったので注意) 結果: 0.000000, 0x1ff68ddfb62221dd (IDEからの起動(F5)) 0.000000, 0x1ff68ddfb62221de (コマンドプロンプトからの起動) 最後の2bitが異なる。(誤差は1bit) 備考: 俺が遭遇しているのとはやや異なる。(俺の場合、Debugビルドでもこれが発生する) この再現状況だと、単に 「DebugとReleaseでバイナリが異なり、 IDEから起動した場合は常にDebugバイナリを掴んでいるだけでは?」 とも取れるが、こちらで確認した限りはちゃんとReleaseバイナリを掴んでいる。 理由は、 1. Debug/Releaseの両方のバイナリがない状態で実行した場合、 自動的に作成されるのはReleaseバイナリ。(当然だが) 結果は****ddとなる。(ブレークポイント等で止めて確認する) 2. そのReleaseバイナリをコマンドプロンプトから起動すると、****deの結果が得られる。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/190
191: デフォルトの名無しさん [sage] 2018/09/15(土) 20:37:06.43 ID:UR1d6CKz ソース: #include "stdafx.h" #include <math.h> using namespace System; template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug. double norm = 0; for (int i=0;i<num;i++) norm += (double)r[i] * (double)r[i]; norm = sqrt(norm); if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); return norm; } int main(array<System::String ^> ^args) { int count = 16; __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}; double* inputs = (double*)inputs_hex; double norm = calc_norm_and_regulate(count, inputs, false); Console::Write(String::Format("{0:F6}, 0x{1:x16}\r\n",norm, *(__int64*)&norm)); // Release build // 0.000000, 0x1ff68ddfb62221dd from IDE // 0.000000, 0x1ff68ddfb62221de from command prompt return 0; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/191
192: デフォルトの名無しさん [sage] 2018/09/15(土) 20:42:48.06 ID:UR1d6CKz オプション等(コマンドライン):(全てデフォのままのはずだが一応) C/C++: /GL /D "WIN32" /D "NDEBUG" /D "_UNICODE" /D "UNICODE" /FD /EHa /MD /Yu"stdafx.h" /Fp"Release\test_floating_error4.pch" /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /clr /TP /errorReport:prompt /FU "c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll" /FU "c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /FU "c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.XML.dll" リンカ: /OUT:"MYPATH\test_floating_error4\Release\test_floating_error4.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\test_floating_error4.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"MYPATH\test_floating_error4\Release\test_floating_error4.pdb" /LTCG /DYNAMICBASE /FIXED:No /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT パスは$MYPATHと書き換えた。また、投稿の為に適宜改行を入れた。 このプロジェクト名は見れば分かるとおりtest_floating_error4。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/192
193: デフォルトの名無しさん [sage] 2018/09/15(土) 20:43:03.84 ID:UR1d6CKz 備考2: なおこの方法で見える calc_norm_and_regulate 関数の『逆アセンブル』結果は 俺の環境での物とコールアドレス以外は一致していることを確認している。 一応、diff結果は以下。 8c8 < 0000000c cmp dword ptr ds:[00752E14h],0 --- > 0000000c cmp dword ptr ds:[007D2E14h],0 10c10 < 00000015 call 676F58B9 --- > 00000015 call 683C58B9 44c44 < 0000006a call FF0455E8 --- > 0000006a call FFD955E8 http://mevius.5ch.net/test/read.cgi/tech/1413180800/193
194: デフォルトの名無しさん [sage] 2018/09/16(日) 02:47:43.28 ID:wIV2HUNW >>190 C++/CLR では、.Net を使っているから、起動方法が違うだけでも、 fpu control word の値や、使うCPU命令がx87 FPUなのか、SSE なのかが違ってくる可能性があるかもしれない。 fpu control word は、main()関数に入る前の start up codeの中で 初期化される。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/194
195: デフォルトの名無しさん [sage] 2018/09/16(日) 03:19:36.22 ID:wIV2HUNW >>191 // Release build // 0.000000, 0x1ff68ddfb62221dd from IDE // 0.000000, 0x1ff68ddfb62221de from command prompt それにしても、随分小さな値だね。ちなみに、浮動小数点表示 の場合の有効数字の桁数を上げたら、どのようになる? 1.xxxe-yy 表示にして。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/195
196: デフォルトの名無しさん [sage] 2018/09/16(日) 03:40:33.66 ID:wIV2HUNW >>191 試しに、ソースの冒頭に #include <stdio.h> を追加してから、 Console::Write(String::Format("{0:F6}, 0x{1:x16}\r\n",norm, *(__int64*)&norm)); の部分を、 printf( "%30.30e, 0x%016X\n", norm, *(__int64*)&norm) ); としてみるとどうなる? http://mevius.5ch.net/test/read.cgi/tech/1413180800/196
197: デフォルトの名無しさん [sage] 2018/09/16(日) 03:42:01.82 ID:wIV2HUNW >>196 誤: printf( "%30.30e, 0x%016X\n", norm, *(__int64*)&norm) ); 正: printf( "%30.30e, 0x%016X\n", norm, *(__int64*)&norm ); http://mevius.5ch.net/test/read.cgi/tech/1413180800/197
198: デフォルトの名無しさん [] 2018/09/16(日) 07:27:22.50 ID:SOVIz+sV > 0x1ff68ddfb62221dd(Debug) > 0x1ff68ddfb62221de(Release) VS 2010 VC++ Express でも再現した http://mevius.5ch.net/test/read.cgi/tech/1413180800/198
199: デフォルトの名無しさん [] 2018/09/16(日) 07:38:10.70 ID:SOVIz+sV ↓このループを抜けたあと、すでにReleaseビルドとDebugビルドでは normの値に差異が発生してることが確認できた for (int i=0;i<num;i++) norm += (double)r[i] * (double)r[i]; ↓この下に(ループ内に)fprintf文を入れるだけで ReleaseビルドとDebugビルドが同じ実行結果になることが確認できた norm += (double)r[i] * (double)r[i]; とりあえずまずこれだけは分かったから 低学歴知恵遅れが書いたウンココードの問題箇所を限定する http://mevius.5ch.net/test/read.cgi/tech/1413180800/199
200: デフォルトの名無しさん [] 2018/09/16(日) 07:51:03.41 ID:SOVIz+sV ?-1 デフォルト設定(Release) 【コード】 #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> int main(array<System::String ^> ^args) { __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; double* r = (double*)inputs_hex; double norm = 0; for (int i = 0; i < 16; i++) { norm += (double)r[i] * (double)r[i]; // fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); } fprintf(stdout, "0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/200
201: デフォルトの名無しさん [] 2018/09/16(日) 07:51:56.62 ID:SOVIz+sV ?-1 デフォルト設定(Release) ↓このコードの逆アセンブルコード https://ideone.com/Ryyxkl 【実行結果】 0x0007F2C44DFFF8F2:1.1053482540585106e-308 http://mevius.5ch.net/test/read.cgi/tech/1413180800/201
202: デフォルトの名無しさん [] 2018/09/16(日) 07:53:20.79 ID:SOVIz+sV ?-2 デフォルト設定(Release) #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> int main(array<System::String ^> ^args) { __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; double* r = (double*)inputs_hex; double norm = 0; for (int i = 0; i < 16; i++) { norm += (double)r[i] * (double)r[i]; fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); } fprintf(stdout, "0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/202
203: デフォルトの名無しさん [] 2018/09/16(日) 08:02:12.99 ID:SOVIz+sV ?-2 デフォルト設定(Release) ↓このコードの逆アセンブルコード https://ideone.com/4j12ib 【実行結果】 ↓実行結果を書き込めないからこっちに書き込んどいた https://ideone.com/gOqtki 0x0007F2C44DFFF8F1:1.1053482540585101e-308 http://mevius.5ch.net/test/read.cgi/tech/1413180800/203
204: デフォルトの名無しさん [] 2018/09/16(日) 08:05:50.92 ID:SOVIz+sV ?-1 最適化無効 (/Od)(Release) ※ コードは?-1(>>200)と同じ ↓このコードの逆アセンブルコード https://ideone.com/cONCAx 【実行結果】 0x0007F2C44DFFF8F1:1.1053482540585101e-308 http://mevius.5ch.net/test/read.cgi/tech/1413180800/204
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 110 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.016s