Visual Studio 2008 Part 22at TECH
Visual Studio 2008 Part 22 - 暇つぶし2ch31:デフォルトの名無しさん
15/02/04 09:28:42.40 fF80T871.net
\r\n と書くと \x0D\x0D\x0A を出力する変な環境があったな
(コンパイルオプションとか fopen の wb|ab とか付け忘れじゃなくて)

32:デフォルトの名無しさん
15/02/05 00:08:21.94 l8QaN41D.net
Windowsだな。
\n は、C言語とかでは単に「改行」を表すエスケープシーケンスであって、
実コードは環境によって変わってくる。
Windowsでは 0x0D, 0x0A、Unixは0x0A、昔のMacは0x0Dだったとか。

33:デフォルトの名無しさん
15/02/05 08:29:11.69 n7T33kxd.net
知らないならレスしないでください
うざいだけです

34:デフォルトの名無しさん
15/02/05 11:48:59.49 VtKwLCjB.net
ワロタ

35:31
15/02/05 23:37:48.31 7AipLZm5.net
俺のことか?
\nが0x0D,0x0Aなんだから、0x0Dになる\rに繋げて \r\n とすれば、
0x0D,0x0D,0x0Aが出力されるのは当然だろ?

36:デフォルトの名無しさん
15/02/06 06:10:49.98 FVCocBTO.net
いや、Windowsだろうがなんだろうが「0x0d=\r」「0x0a=\n」だよ
これは変わらない
OSによって「\r」「\n」「\r\n」のどれかをシステム標準としているだけ
のこと

37:デフォルトの名無しさん
15/02/06 06:12:07.23 FVCocBTO.net
つまり
>>35
>\nが0x0D,0x0Aなんだから
↑この理解がおかしい

38:デフォルトの名無しさん
15/02/06 11:52:15.65 0UnHsvEY.net
>>36
Windows2000のtracertとか
\n\r なんてやってるコンソールアプリがあるわけだが・・・
>tracert 2ch.net>log.txt

39:デフォルトの名無しさん
15/02/06 12:31:07.66 XYA8veRx.net
>>38
unix系譜のコマンドを持ち出してくるってことは、分かった上でやってるんだと思うが
やらしいなキミは
システム標準の意味をもうちょい考えようね

40:デフォルトの名無しさん
15/02/06 18:46:43.38 O9DsWVzT.net
つまり面倒だからstd::endlを使えって事なんです?

41:デフォルトの名無しさん
15/02/07 01:10:14.98 1rQMkrzn.net
いやいや、なんのこっちゃ
>r\n と書くと \x0D\x0D\x0A を出力する
「出力する」
だろ?
そりゃ確かに\n自体は0x0Aだし\rは0x0Dだが、「出力する」という事に対しては
Windowsは\nが0x0D,0x0Aじゃないか。

42:デフォルトの名無しさん
15/02/07 11:13:31.00 JI4HMs8u.net
いや、出力「しない」んだが
どんなコード書いたら吐くのか

43:デフォルトの名無しさん
15/02/07 16:27:27.15 WHmum7mw.net
w


44:indowsのperlだと \n->\x0D\x0Aに変換 \r\nなんてやると\x0D\x0D\x0Aになる



45:デフォルトの名無しさん
15/02/07 16:49:52.23 Hof4fFat.net
すれち

46:デフォルトの名無しさん
15/02/07 17:51:19.90 TiU3gCM4.net
テキストモードでのファイル出力を使うと
Windowsでは \n が \r\n(0D,0A) に変換される だろ

47:デフォルトの名無しさん
15/02/07 18:40:39.10 BSyaqMEd.net
変換したらそりゃなんでもそーだろうよwww
何言ってんだお前

48:デフォルトの名無しさん
15/02/08 13:36:14.40 kikHBD4l.net
大元が>>31 で、wbつけ忘れじゃないと書いてるんだからバイナリーモードの話のはずなのに
テキストモードの話を始めるからだよ

49:デフォルトの名無しさん
15/02/09 08:19:19.65 hAsZKmdY.net
>>47
だとしてもそれどんな環境よ?ってのは疑問が残るな
Windowsだから、ではないのは明白
で、出力するときに変換したらなんていいだしたらそりゃなんであろうがしたらそーなるだろってのは
そんな的外れでもないと思う

50:デフォルトの名無しさん
15/02/21 21:55:00.33 plzH3cvn.net
URLリンク(downloads.ddigest.com)
ここからダウンロードしたVOBSUB2.23のソースですが、すぐにコンパイルできるものなのですか? Microsoft SDKsのサンプルを揃えたとしても文法えらーばかり出るのですが。
例えばこんな感じ。
for(int i=0; i>3; i++)
{
~~~
}
for(i=0; i>3; i++) <-- ここでえらー
{
~~~
}
あと、きちんとキャストしていなかったりと・・・かなり甘めのオプションとかつけてコンパイルしているのかなあと。

51:デフォルトの名無しさん
15/02/22 04:12:18.90 Hs/4VJBJ.net
-for(i=0; i>3; i++) <-- ここでえらー
+for(int i=0; i>3; i++)

52:デフォルトの名無しさん
15/02/22 07:45:29.13 uX3Bvmht.net
さすがにそれは判ってて質問してるだろ
いちいち甘めのオプションで~って話だと受け止めたが

53:デフォルトの名無しさん
15/02/22 10:05:49.59 +Mmh1x19.net
>>49
昔のCやC++とブロックのスコープが変わってるからな。
とくにfor文の int は昔と今で扱いが違う。

54:デフォルトの名無しさん
15/02/22 10:28:09.76 tFIS8X7o.net
レスありがとうございます。
一応分かってるつもりで質問したのですが
元のソースがVC6からVC7へ変換してある形跡があって
そのslnソリューションをVS2008で私がさらに変換した状態です。
先ほどのエラーはほんの一例でよくコンパイラがとおったなと思う
レベルでびっくりしました。プログラムは複雑なのに。
後はキャスト変換がおかしいとか、そういうのばかりだったので
地道に文法エラーだけはつぶしました。
今のところ、見た目はきちんと動いているように見えます。
VC7を使っているとすれば先ほどのコンパイルエラーくらいは
出るだろうと思っていたのですが、作者はどうしていたのでしょうね。

55:デフォルトの名無しさん
15/02/22 10:44:19.67 uX3Bvmht.net
拡張子間違ってるだけというオチかも知れない

56:デフォルトの名無しさん
15/04/08 00:53:40.48 51Wd8GKc.net
わはは

57:デフォルトの名無しさん
15/05/12 18:20:32.21 gAoTmxoz.net
test

58:デフォルトの名無しさん
15/07/02 02:17:45.70 QApi8frR.net
なんかあります?

59:デフォルトの名無しさん
15/07/15 13:26:02.23 mBlD3Q7e.net
VC++6.0で作ったActiveXコントロールを64bit化したいと思い
Visual Studio 2008でプロジェクトを開きコンパイル
してみたのですが
error RC2135 : file not found: hoge.tlb
というエラーがどうしても治せません。
なにかヒントになるようなものはないでしょうか?
よろしくお願いいたします。

60:デフォルトの名無しさん
15/07/15 13:58:54.98 mBlD3Q7e.net
出力ディレクトリと中間ディレクトリを
.\Debug
に変更したらできました。

61:デフォルトの名無しさん
15/09/23 15:19:11.68 mtvdh8Dc.net
ちょっとあげておきます

62:デフォルトの名無しさん
15/09/30 17:09:43.49 wkKKGVGV.net
Visual Studio 2008(Basic, C#, C++)の
 ヘルプ → 製品の登録
からライセンス登録の手続きをして登録キーを手に入れたいのですが
どうすればいいのでしょうか?
どなたか心優しい方、どうか教えてくださいませ。
私のパソコンOSはWindows Vista Businessです。

63:デフォルトの名無しさん
15/09/30 19:13:52.56 AXFtzTRL.net
あきらめろ

64:60
15/09/30 20:56:54.91 wkKKGVGV.net
>>62
そこをなんとかお願いします。
…もしかして「あきらめろ」というのは「それは不可能」という意味ですか?

65:デフォルトの名無しさん
15/10/01 08:18:22.09 mpdw7HPU.net
悪魔の囁きに載るな

66:60
15/10/01 08:30:19.07 5sGFr3sa.net
どなたか教えてください。30日以内に登録しなきゃ駄目らしいんで。
URLリンク(msdn.microsoft.com)(v=vs.90).aspxで登録方法を調べました。
「3.Passport にサインインし、オンライン登録フォームに入力します。」と書いてあります。
しかし、Passportへのサインインのしかたが分かりません。
そもそもPassportってなんなのかも知りません。
ど素人でまことに申し訳ないんですが、どなたかよろしくお願いします。

67:デフォルトの名無しさん
15/10/01 11:02:45.05 mpdw7HPU.net
今はマイクロソフトのアカウントに統一されてるんじゃないのかな

68:60
15/10/02 19:16:01.01 AWZIs7jF.net
>>66
その「マイクロソフトのアカウント」の取得方法を教えていただけないでしょうか
無知など素人で誠に申し訳ありません

69:デフォルトの名無しさん
15/10/03 12:37:25.65 jyP1OZ7g.net
URLリンク(office.com)

70:デフォルトの名無しさん
15/10/04 14:50:35.13 WlWBixqv.net
URLリンク(www.microsoft.com)

71:60
15/10/05 19:08:49.27 dhDe7Zf7.net
>>68, >>69
すみません
そのウェブサイトに行っても、どこにも「登録キー」を取得するページが見つかりません
本当にすみませんが、URLだけでなく具体的にどうしたらいいかを教えてください
よろしくお願いします

72:デフォルトの名無しさん
15/10/05 20:17:42.89 8plgvxHj.net
まずMicrosoftアカウントを取得

そのMicrosoftアカウントでログイン(旧Passport)

2008登録...ってまだできるの?

73:デフォルトの名無しさん
15/11/01 17:46:18.91 wW4dECTr.net
2008ってWindows10で動く?

74:デフォルトの名無しさん
15/11/06 17:15:53.66 bip5Bf06.net
Visual Basic 2008 Express
GF834-7Q2DB-FG2WR-987CY-CV4GY
Visual C# 2008 Express
FBT3W-MHQHF-PTDCF-66Y32-BQ9XM
Visual Web Developer 2008 Express
JYRQW-R4M7G-6HHX8-T2C3Y-KCG9M
VS2008ExpressWithSP1JPNX1504866.isoの vs_setup.MS_ の中にあったキー

75:デフォルトの名無しさん
15/11/13 05:38:02.63 /OfqoLLw.net
>>71
Win10に入れてるけど、通知をクリックしても登録は出来ない
iso持ってるなら通知は止まらんがそのまま使用可能

76:デフォルトの名無しさん
15/12/14 21:44:25.18 FHkK4gA8.net
VS2008自体ってDPIスケーリングに対応してなくない?
しかもdevenv.exeを右クリックしても「互換性」のタブすら出てこなくない?

77:デフォルトの名無しさん
15/12/16 08:44:29.34 VuxlJzaM.net
で?

78:デフォルトの名無しさん
15/12/16 08:56:29.33 fgV80IeN.net
>>75
対応してないと何が困る?

79:デフォルトの名無しさん
15/12/18 22:34:12.78 fM7+Vhbq.net
DPI設定を変えているPCでVS2008を使うとダイアログなどの文字がボヤけて見にくいのが困ります。

80:デフォルトの名無しさん
15/12/19 02:05:16.98 jNmY687L.net
VS限定の話ではない気がします
解像度高いモニター使ってください

81:デフォルトの名無しさん
15/12/19 23:20:20.16 t2VnwwG/.net
1行目はただの感想ですね。
2行目も今より解像度高いモニタ使ってどうするんですかw

82:デフォルトの名無しさん
15/12/22 17:00:55.68 84O49K/C.net
Windows10にVS2008入れて動かした人いる?
実際入れてC++コードのx64のプロジェクトをデバッグでステップ実行させようとしたら
ローカルデバッグにしているはずなのに何故かリモートで動こうとして全く駄目だわ。
x86のプロジェクトだと普通に動いて草w
もちろん64bitOS環境なんだが、なんかまずいことでもあるんかねー

83:デフォルトの名無しさん
15/12/22 20:43:05.89 MeTIwjrP.net
>>80
理解できないなら永遠にXPでも使ってろよw

84:Office & Gamers @ 試験運用中(トリなしw
16/01/07 03:41:59.64 lPhmWPE4.net
>>81
Win10 32bit版で2008Express版使ってるけど、64bitコード出力は試してないなw
ライブラリーと関連ない?w

85:デフォルトの名無しさん
16/01/27 07:59:16.52 zSpoUlJp.net
ランタイムライブラリ→マルチスレッド(/MT)に設定してるんだけど、
外部のライブラリを、追加の依存ファイルで設定して、
リンクするときに静的にEXEに埋め込めると思ったのですが出来ないんだっけ?
他に設定とかあります?

86:デフォルトの名無しさん
16/01/27 12:42:35.88 sapMCej1.net
/MT関係なく、外部のライブラリは普通にスタティックにリンクされるでしょ
それがダイナミックリンクライブラリなら、その時も/MT関係なくDLL使用になるし

87:デフォルトの名無しさん
16/01/27 19:57:56.71 L48s/ty/.net
>>85
DLLはEXEの中に組み込まれないの?
他の環境で動かそうとしたら、「~DLLが見つからない」ってエラー出たから。

88:デフォルトの名無しさん
16/01/28 11:26:11.51 Zt+/Dst2.net
それは無理
スタティックリンクライブラリとダイナミックリンクライブラリは別物なので
LIB作成時に両方作るか、どちらかに決めておかないと。

89:デフォルトの名無しさん
16/01/28 12:44:14.37 QZ7ojH/n.net
>>87
ありがとうございます。
DLLが見つからなかった場合、ライブラリを使う関数を使わないようにする
宣言か何かあったと思ったけど、方法わかりますでしょうか?
ググる際のキーワードでもいいですので教えていただけますと助かります。

90:デフォルトの名無しさん
16/01/28 14:10:53.25 Zt+/Dst2.net
どうだろ、、
SearchPath で事前に探しても探さなくてもいいけど
LoadLibrary の戻りで判定しては。
見つかった場合はGetProcAddress使って呼び出せる。

91:デフォルトの名無しさん
16/01/28 16:26:06.24 CWsUf0Ic.net
いつも開発マシン内で遊んでるだけなんで気にならないなぁw
所詮アマなんで。

92:デフォルトの名無しさん
16/01/28 22:16:13.85 eov953Lu.net
遅延ロードとかその辺の話かな

93:Office & Gamers @ 試験運用中(トリなしw
16/02/12 12:32:41.66 6YJueMB6.net
VC++ & DarkGDK & マルチスレッドの時代。(アハ

94:デフォルトの名無しさん
16/03/04 18:17:24.48 37GSZskT.net
Microsoft Visual C# 2008
インストールしました!
よろしくおねがいします!

95:Office & Gamers @ 試験運用中(トリなしw
16/03/11 20:04:23.17 L/5EiKH/.net
そして大勝利♪(アハ♪”

96:デフォルトの名無しさん
16/03/15 15:00:08.48 ZBek540b.net
何が大勝利なんだろ?
頭おかしいのかな?

97:デフォルトの名無しさん
16/03/15 15:52:47.08 vv+Ey9Qp.net
いろいろ楽しいのでしょう

98:Office & Gamers @ 試験運用中(トリなしw
16/04/14 12:07:09.86 co1HctEv.net
VC++ & DarkGDK & マルチスレッドの時代。(アハ

99:デフォルトの名無しさん
16/04/14 12:20:54.38 kJxBjGsl.net
次回テンプレには、念のため、次のURLもヨロシクです。
スレリンク(tech板)l50
Visual Studio 2015 Part4©2ch.net

100:Office & Gamers @ 試験運用中(トリなしw
16/04/15 09:58:04.51 4RT2pJWa.net
[ お手軽3Dゲーム開発♪ ] DarkGDK Part.2
スレリンク(pc2nanmin板)

101:デフォルトの名無しさん
16/06/15 02:48:16.19 +TkysGmJ.net
保守

102:デフォルトの名無しさん
16/07/03 10:11:48.55 OI2UBYKc.net
確信

103:Office & Gamers @ 試験運用中(トリなしw
16/07/14 23:54:20.48 6zz9Sabt.net
DarkGDK Part.2
スレリンク(tech板)

104:Office & Gamers @ 試験運用中(トリなしw
16/07/14 23:54:54.13 6zz9Sabt.net
いちおう、ここも準・本スレ扱いw

105:Office & Gamers @ 試験運用中(トリなしw
16/07/14 23:57:55.59 6zz9Sabt.net
VS2008ExpressWithSP1は、本体が1GB未満とサイズが小さいから、インストールにもそれほど時間はかからない。

106:Office & Gamers @ 試験運用中(トリなしw
16/07/16 12:24:10.86 cScNFvUG.net
そしてランチタイム♪”

107:デフォルトの名無しさん
16/07/16 13:28:43.61 uoDFz9DZ.net
なにたべよー

108:Office & Gamers @ 試験運用中(トリなしw
16/07/23 04:45:29.02 SycPzxgL.net
あげ

109:Office & Gamers @ 試験運用中(トリなしw
16/08/17 10:46:32.90 +njSpS9N.net
よいしょ、っと♪(アハ♪”
DarkGDK Part.3
スレリンク(tech板)

110:Office & Gamers @ 試験運用中(トリなしw
16/08/21 12:30:58.28 0ruOe10Q.net
そしてランチタイム♪”

111:デフォルトの名無しさん
16/08/21 12:47:10.76 ONJlbRqy.net
なにたべよー

112:Office & Gamers @ 試験運用中(トリなしw
16/08/28 12:19:13.90 zR1ENZmn.net
そっそw

113:Office & Gamers @ 試験運用中(トリなしw
16/08/29 03:30:44.79 UdG9pR1y.net
スレ建て規制により、DarkGDK次スレが建つまでこちらへw
[ お手軽3Dゲーム開発♪ ] DarkGDK Part.2
スレリンク(pc2nanmin板)
[ お手軽2Dゲーム開発♪ ] 99BASIC Part.1
スレリンク(pc2nanmin板)
[ MML / MIDI ] ゲーム開発用サウンド、BGMスレ
スレリンク(pc2nanmin板)
MenuetOS 64bit版 アセンブリ言語 プログラミング
スレリンク(tech板)
[EXEファイル可] JavaScript統合開発環境 DX Studio
スレリンク(tech板)
VC++ with DarkGDK and multi thread programming
URLリンク(jbbs.shitaraba.net)

114:デフォルトの名無しさん
16/10/01 12:46:46.84 dfnenJuX.net
もうないか・・・

115:デフォルトの名無しさん
16/10/24 02:13:48.56 d0/b/4pF.net
まだまだExpress使い続けるよ
やはり2008 SP1が一番良いなと感じる

116:デフォルトの名無しさん
16/10/25 06:47:31.51 z9wtE8t2.net
光学メディアに焼いてインストールすれば
Micorsoftに登録しなくても使えるって利点があるよね。
ネットワークから隔離した古い機械・古いOSで使える。

117:デフォルトの名無しさん
16/10/25 13:51:32.89 Gjmp6BYY.net
>>114
+1

118:Office & Gamers @ 試験運用中(トリなしw
16/11/04 14:30:58.29 7cL8AT5k.net
ageとくかw

119:デフォルトの名無しさん
16/11/04 21:41:52.44 lyUY8xNL.net
2008も自動的に更新されますか?

120:デフォルトの名無しさん
16/11/05 18:19:54.10 WxLvBjbX.net
反応なし

121:デフォルトの名無しさん
16/11/26 01:54:18.31 wbn1VWla.net
>>78
デバッグウィンドウのサイズを変えようとすると、
影が変なところに出てこない?

122:デフォルトの名無しさん
17/02/16 22:00:42.08 7GOAgwDK.net
Panda3D SDK 1.9.3をMicrosoft Visual C++ 2008 Express Edition
で使いたいのですが、インクルードで躓いてます。
どうやるのか教えてください

123:片山博文MZ ◆T6xkBnTXz7B0
17/02/16 22:42:51.55 soSRPnhw.net
>>121
汚い方法は、インクルードパスに必要なヘッダーファイルを貼り付けて、ライブラリパスにビルド済みのライブラリファイルを貼り付ける。
システムを汚さない方法はプロジェクトのプロパティでヘッダーファイルがある場所をインクルードパスに追加し、ビルド済みのライブラリファイルがある場所をライブラリパスに追加。
これでOK。

124:デフォルトの名無しさん
17/02/16 22:45:45.89 K2hmhl0o.net
URLリンク(www.panda3d.org)
に2010(2015でも良い)って書いてあるけど、わざわざ苦行を求めるのか?
2008ではサポートされてないWindows7 SDKが必要らしいんで、できるとしても面倒くさい可能性大

125:デフォルトの名無しさん
17/02/16 22:51:03.70 KsbZvWE2.net
URLリンク(i.imgur.com)

126:デフォルトの名無しさん
17/02/16 22:59:24.65 lXiZQpBh.net
print "
とすると勝手に
print ""になってエンターを押すと
print "
"
っておかしくなります
print ""
|
ってするにはどおするばよいですか?
うまく伝えてられるかわかりませんがよろしくお願いします
m(_ _)m

127:デフォルトの名無しさん
17/02/16 23:24:34.28 1tgOe9Xz.net
>>125
Endキーでも使うとか?
補完自体を殺すことも設定で可能だったと思うけど

128:デフォルトの名無しさん
17/02/17 00:25:38.74 NkX+r5wc.net
回答
ありがとう

129:デフォルトの名無しさん
17/04/11 14:18:08.96 QtRG4BLX.net
End of Support for Visual Studio 2008 - in One Year
URLリンク(blogs.msdn.microsoft.com)

130:デフォルトの名無しさん
17/05/18 08:51:36.17 thYMhZbz.net
>>61
コメント内容
試用期間
EEは無料

131:デフォルトの名無しさん
17/05/18 08:52:36.67 thYMhZbz.net
>>61
eメールのアカウントが必要

132:デフォルトの名無しさん
17/05/18 09:02:35.23 thYMhZbz.net
dll

133:デフォルトの名無しさん
17/05/18 09:03:37.43 thYMhZbz.net
>>125
コメント内容
パソコンの周りをきれい委にする。

134:デフォルトの名無しさん
17/05/18 09:04:21.32 thYMhZbz.net
今の時代、パソコンでテレビが見れないとだめなのか。

135:デフォルトの名無しさん
17/05/18 09:12:17.83 thYMhZbz.net
.iso

136:デフォルトの名無しさん
17/06/03 19:22:27.66 cZuYHM9v.net
古い奴だとお思いでしょうが、古い奴こそ新しいものを欲しがるもんでございます。
どこに新しいものがございましょう…
「傷だらけの人生」
藤田まさと作詞・吉田正作曲

137:デフォルトの名無しさん
17/06/15 00:13:00.81 0Bo/JfNC.net
KB957507って現在は入手不可能?

138:デフォルトの名無しさん
17/07/06 07:11:13.84 6wMkdZx/.net
温故知新(おんこちしん)

139:デフォルトの名無しさん
17/10/03 08:49:19.60 dPWSl44k.net
>>136
URLリンク(support.microsoft.com)
出典は
URLリンク(lsair.html.xdomain.jp)
いつものHotFixの画面だったから大丈夫かと・・・
試してはいないけどw

140:デフォルトの名無しさん
18/01/20 12:54:23.17 bSTKludV.net
VC++2008にユーザプリプロセッサを噛ませる方法ってある?
関連質問は以下。
スレリンク(tech板:395番)
VC++2017相当のラムダをVC++2008で使いたい。
MSVCのプリプロセッサだけでは多分無理っぽい。
自前のプリプロセッサをまず通し、結果をVSでコンパイルすれば確実にいけるのだが、
これをやる方法ってある?
(自前のプリプロセッサはスクリプト言語で書く)

141:デフォルトの名無しさん
18/01/20 13:28:02.32 5zEZap2N.net
.cppじゃなくて.cupみたいなソース書いて
.cup->.cppにするならいける

142:デフォルトの名無しさん
18/01/20 13:37:19.70 bSTKludV.net
>>140
多分カスタムビルドツールだよね?今それを見ていたところ。
URLリンク(msdn.microsoft.com)
とりあえずこれから試してみる。ありがとう。

143:デフォルトの名無しさん
18/01/20 13:44:14.42 5zEZap2N.net
最近の人はmake書いたこと無いんか

144:デフォルトの名無しさん
18/01/20 14:14:17.24 bSTKludV.net
>>142
手動makeか。まあその手もあるか。

145:デフォルトの名無しさん
18/01/20 14:25:54.52 Hc/lJP5p.net
Makefile家や

146:デフォルトの名無しさん
18/01/20 14:27:12.33 4AOaXNlF.net
make書いたら負け

147:デフォルトの名無しさん
18/01/20 14:40:08.73 bSTKludV.net
まあどっちでもいいと思うが。
Cマクロで出来れば一番簡単だが、どうやらこれは無理。
ならば次善策は自前でのスクリプティングであり、
主な手間はmakefile/カスタムビルドツール設定ではなく、
スクリプトを作成することなんだから、この際起動はどっちでもいいだろ。

148:デフォルトの名無しさん
18/01/20 15:02:15.30 4AOaXNlF.net
Dで書いてobjリンクする

149:デフォルトの名無しさん
18/01/20 15:57:47.74 bSTKludV.net
ちなみに、以下確かに動くのだが、これってどうなん?
URLリンク(stackoverflow.com)
(超絶簡単なソースしか試してないが)
・コンパイルは c:\windows\microsoft.net\framework\v2.0.50727\system.dll : warning C4945: が出つつも通る。
・F5でのデバッグ実行が出来ない。「デバッガのプロトコルがデバッグされる対象と互換性がありません」
・IntellisenseはVC++/CLIでも機能している。

>>147
なおラムダはGUIからの機能選択部で使うので、
結構な頻度で追加/書き換えしており、ソースは分離したくない。
普通に考えればVC++2017に上げればいいだけではあるが、
環境を変更すると色々他の問題が発生するかもしれないのでちょっと無理しようとしている。

150:デフォルトの名無しさん
18/01/20 16:02:31.52 5zEZap2N.net
本質と関係ない話題の方が盛り上がるのが2ch

151:デフォルトの名無しさん
18/01/20 16:09:16.48 5zEZap2N.net
>>148
>確かに動くのだが、これってどうなん?
動くならそれでいいんじゃない?
同じレス内で
>環境を変更すると色々他の問題が発生するかもしれないので
っていうのとは真逆の態度だとは思うが

152:デフォルトの名無しさん
18/01/20 23:47:48.29 bSTKludV.net
まだカスタムビルドには組み込んでいないが、スクリプトを作成し、動作することを確認した。
知恵を絞ってくれた人はありがとう。現在の解決策は以下。
・#define LAMBDA でインラインの展開を行う。
・クラ�


153:X宣言部はスクリプトで作成し、これをincludeする。 VS2017に上げてもLAMBDAマクロ宣言部だけの変更(1行)で済む予定なので、まあまあかと。 とりあえずこれで様子見します。



154:デフォルトの名無しさん
18/04/10 07:51:46.77 25Me0atb.net
最終列車に乗り遅れるな
VC++2008Expressサポート切れまであと1日。
2018年4月11日(水)でサポート終了。
修正パッチの入手の終わってない人は忘れないように。

155:デフォルトの名無しさん
18/04/10 14:36:15.41 JIHFaEMv.net
GJ

156:デフォルトの名無しさん
18/04/11 01:33:09.61 PizNPnSY.net
必死だなぁw

157:デフォルトの名無しさん
18/04/11 13:05:30.31 Gexxa1fK.net
URLリンク(forest.watch.impress.co.jp)
「Microsoft Visual Studio 2008」のサポートが終了 ~無償版「Express Edition」も
「Microsoft SQL Server Compact 3.5」なども対象

158:デフォルトの名無しさん
18/04/11 13:06:06.48 bG1z7LTF.net
ああ終わったか
乙でした

159:デフォルトの名無しさん
18/04/11 13:26:11.45 bG1z7LTF.net
てst

160:デフォルトの名無しさん
18/04/12 14:51:25.15 nqXIWDjI.net
《 後継開発環境のご案内 》
LinuxMintのダウンロードはこちらから。
Main Page - Linux Mint
URLリンク(linuxmint.com)
URLリンク(linuxmint.com)
---------
AGK無料試用版の配布開始(リンク先にWindows、Mac、Linux版のファイルが直接置いてある)
AppGameKit - Free Trial Version
URLリンク(www.appgamekit.com)
無料試用版
AppGameKit無料トライアル版は、AppGameKitの主要な領域すべてにアクセスできるため、
完全に評価することができます。完全版の有料版には、次の主要機能が含まれています。
・ Android、iOS、HTML5にプロジェクトをエクスポートする
・ アプリをデバイスに直接ブロードキャストする
・ コンパイルされたプロジェクトからウォーターマークを削除する

161:デフォルトの名無しさん
18/04/16 00:56:57.36 CadfvnK3.net
WineでPassmarkとHDbenchを試したところ、シングルスレッド性能はWindowsより若干高く、マルチコア性能は半分程度に留まった。
おそらくWine内部処理の都合と言うことにw
また、DirectXテストは通らなかった。GDIクラスのみ。

162:デフォルトの名無しさん
18/04/22 03:49:49.80 CAx4oxnE.net
…って言う訳で、早速Linuxのパフォーマンステスト。
64x64ピクセルの2Dスプライトの表示枚数をカウントして、パフォーマンスを計測してみよう。
ダウンロードは以下のリンクからどうぞ。
URLリンク(upload.saloon.jp)
Firefoxブラウザの右上にダウンロードマーク(↓)の付いたアイコンをクリックして、ファイル
アイコンをクリックすると、zipファイルの入ったフォルダが表示されるので、右クリックして
「 Extract Here 」 を選ぶ。
次に、「 agk_sample 」 と言うフォルダが作成されるので、ダブルクリックする。
フォルダの中に 「 abc 」 と言う拡張子のないファイル、「 media 」 と言うランタイムの入った
フォルダが作成されている。
「 abc 」 と言う拡張子のないファイルが、実行ファイルで、これを迷わずダブルクリックすれ
ばよいw
だいたい2分ぐらいで最大表示枚数が安定する。
プログラムの終了は [ ESC ] キー。
Celeron G1820 + Intel HD無印 で1500枚程度。

163:デフォルトの名無しさん
18/05/23 19:42:34.90 Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
CRP7I

164:デフォルトの名無しさん
18/05/24 10:53:48.52 cPlRxlDn.net
CRP7I

165:デフォルトの名無しさん
18/05/25 19:20:37.97 TsdeULHr.net
ではではw
Intel Pentium G5 CoffeeLake 総合スレ
URLリンク(anago.open) 2ch.net/test/read.cgi/jisaku/1526884213/

166:デフォルトの名無しさん
18/07/04 22:48:21.01 gFgZc5FG.net
TJH

167:デフォルトの名無しさん
18/07/06 12:24:57.09 uTPDH9XV.net
TJH

168:デフォルトの名無しさん
18/08/23 09:04:57.51 by5uxKdK.net
VC9 SP1 Hotfix For The vector<function<FT>> Crash
がダウンロードできないのですが、
どなたかアップロードしていただけないでしょうか?
URLリンク(blogs.msdn.microsoft.com)

169:デフォルトの名無しさん
18/09/13 23:46:46.29 MPXnmy/B.net
起動の仕方で浮動小数点演算に誤差が発生するのだけど、理由が分かる人居ますか?
今のところ、
A. Debugビルドのバイナリをダブルクリックして起動
B. Releaseビルドのバイナリをダブルクリックで起動
C. DebugビルドまたはReleaseビルドでF5で起動
の3種類出来てる。それぞれ微妙な誤差だ。(doubleの下位ビット)
AとBの違いについては諦めていたのだが、(なお両方とも/fp:precise)
実はCもあると気づいてしまった。
なお、バイナリをダブルクリックして起動、それにIDEをアタッチしても結果は変わらない。
それぞれAまたはCが出る。
何かIDEの設定を間違っているのだと思うのだけど…

170:デフォルトの名無しさん
18/09/14 12:43:29.26 5xDSXwp0.net
0fillしてないんだろ

171:デフォルトの名無しさん
18/09/14 13:05:12.93 XcO59d50.net
再現性は100%なので、初期化のミスではない。(と思っている)
演算途中の結果を double なら16進16桁でテキストにダンプしている。
数値だけではないが500MB程度のファイルが出力され、
diff を取ることによりレグレッションテストをしている。
今のところ、A/B/Cの3種類しか出ない。
初期化忘れならこうはならない。(はず)

172:デフォルトの名無しさん
18/09/14 13:09:49.07 Qw2nkUqU.net
MSのエンジニアを信じるか、再現可能なソースも示さず問題だ問題だ言ってるとこの馬の骨とも知れない奴を
信じるかって言われたら迷うことなく前者を信じるw

173:デフォルトの名無しさん
18/09/14 14:43:10.29 XcO59d50.net
俺はIDEのバグだとは思っていない。
何かIDEの設定があって、俺がそれを適切にやってないのだと思っている。
色々見た限り、俺は /fp:precise しか発見出来なかった。
ただしこれは一応適切に設定されている。
他にないかな?ということ。

174:デフォルトの名無しさん
18/09/14 15:49:43.21 cyu8WCuc.net
IDEじゃなくてコマンドラインからコンパイラで直接コンパイルしても一緒?

175:デフォルトの名無しさん
18/09/14 16:14:47.18 XcO59d50.net
どういう意味?
(どれとどれの違いにフォーカスしろと?)
俺はバイナリに問題があるとは思っていない。
何らかの理由で浮動小数点のモードが切り替えられたりしてないかを疑ってる。
だからIDEの設定とか、そっちを見てる。
Release/Debugのバイナリは当たり前だが違ってる。
/O2と/Od等だ。
ただそれでも /fp:precise の場合は
浮動小数点の演算順序を入れ替えない範囲で最適化される事になっている。
逆アセンブラは見たけどちょっとグチャグチャすぎてよく分からなかった。
(見た範囲では演算順序の入れ替えはないように思えた)

176:デフォルトの名無しさん
18/09/14 16:25:44.73 2giHKuhd.net


177:="reply_link">>>167 double型を使っていても、SSEのXMMレジスタなどを使う場合、昔のfld, fst, fmulなどを使う場合より基本的には精度が落ちる。 丸めの方向も四捨五入、正負どちらかの方向への丸めや切り捨てなどの他、確か、精度を気にしない、なんてオプションもあった気がする。ゲームで使うことを想定しているらしい。 SSE用に最適化を掛けると、速度は上がるが精度は落ちるかも知れない。



178:デフォルトの名無しさん
18/09/14 17:45:18.51 XcO59d50.net
>>174
今の範囲ではSSEは使っていない(はず)
「拡張命令セットを有効にする」は「設定無し」になっている。(多分デフォのまま)
見た目全部x87が出てたし。
やっぱRelease/Debugの違いから攻めろって感じか?
俺もF5起動で結果が異なるってのは全く予想してなかったし。(ただしこちらの問題だろうけど)
演算部分は場合によってはSSEのアセンブラに差し替えるので、
問題になる場合には、Release/Debugの違いはこれで吸収するつもりだった。
(これは1ヶ月後にやるかも)

179:デフォルトの名無しさん
18/09/14 17:48:23.40 HVgt1gkj.net
浮動小数点の誤差を考慮に入れてないというイージーな仕様バグですね。

180:デフォルトの名無しさん
18/09/14 21:39:03.40 fXySkelb.net
再現するコードをみないとなにもわかるわけがない
低学歴知恵遅れが書くコードなんかなにをやってるか分からないからな
ごちゃごちゃいってないで再現するコードをあげなさい

181:デフォルトの名無しさん
18/09/15 06:26:55.94 /OsufeBT.net
月並みな意見だけど、
「症状を再現できる最小のソースと初期データ、それとコンパイル環境」
まで切り詰めてみるのが早道じゃないかな。
ちょくちょく発生する事例なら、解決策を知ってる誰かが教えてくれてるかと。
週末、より多くの人が質問を見ることを期待して待つ手もあるけど。

182:デフォルトの名無しさん
18/09/15 08:56:57.28 9ZmI9OgI.net
より基本に立ち返ろう
そもそも誤差はあるのか?
計算結果を何を使ってどう出力しているかだけでもソースを見せてくれ

183:デフォルトの名無しさん
18/09/15 13:36:34.65 heijdb7v.net
>>175
x87でも誤差を丸める方法を fpu control word で設定できる事は出来る。
四捨五入と切り捨てなどを切り替えられる。

184:デフォルトの名無しさん
18/09/15 13:42:47.95 heijdb7v.net
fpu control word で、丸め方法と、精度の二つを独立に設定できる。
この精度の設定で、メモリ上の表現がdouble型でも、計算時のfpuの内部精度が変わってくる。
普通は64bit doubleに対して、fpu内部では80bitの精度で計算する。仮数部のbit数は、確か、それぞれ、53BIT、64BITだったかな。

185:デフォルトの名無しさん
18/09/15 14:05:09.61 heijdb7v.net
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.

186:デフォルトの名無しさん
18/09/15 14:14:58.92 heijdb7v.net
>>182
書いてある意味は、
「SSEやSSE2だと、float(32BIT)やdouble(64BIT)のまま計算するが、x87 fpuだと、もっと高い精度であるところの
  『double extended-precision floating-point format(拡張倍精度浮動小数点フォーマット:80BIT)』
で計算を実行して、丸めてから、floatやdoubleに戻す。
そのため、SSE/SSE2 と x87 fpuでは結果が変わることがある。
しかし、その場合でも結果の違いは、仮数部の LSB (最も価値の小さいBIT)の1BITにだけ現れる。」
というような事。

187:デフォルトの名無しさん
18/09/15 16:09:28.75 aC3C7hdp.net
揚げ足取りだけどLSBを「最も価値が小さい」って直訳はいかがなものかなw
普通に最下位ビットじゃないの?
ところで
> the least-significant bits
これ何で複数形なのかね

188:デフォルトの名無しさん
18/09/15 16:14:15.89 AVfR6YnT.net
2の0乗だから実際価値が低い
上はMVBで

189:デフォルトの名無しさん
18/09/15 17:07:56.98 UR1d6CKz.net
>>183
ありがとう。
ただ一応それは知ってて、その上で、IDEの環境設定等を疑っている。
>>178
とはいえ地道に辿って、同様の再現コードを作ることに成功しそうだ。
もう少し調べて、多分今晩か明日午前中に上げる。

190:デフォルトの名無しさん
18/09/15 17:12:32.47 heijdb7v.net
>>184
「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 という英語になる。

191:デフォルトの名無しさん
18/09/15 17:15:04.14 heijdb7v.net
誤:これは、SSE の場合の LSB と、x87 FPU の場合の FPU の2種類を
正:これは、SSE の場合の LSB と、x87 FPU の場合の 2種類を

192:デフォルトの名無しさん
18/09/15 17:18:55.19 heijdb7v.net
>>184
>揚げ足取りだけどLSBを「最も価値が小さい」って直訳はいかがなものかなw
>普通に最下位ビットじゃないの?
整数の場合は、「最下位ビット」というと、本当にBITの位置が一番右にあるようなイメージもある。
一方、浮動小数点数の場合は、右にあるとかより、仮数部において、一番価値の小さいビット、というニュアンスを使えたかった。
IEEEでは、それは確かに一番右にあるビットであって、マシン語レベルの表現では、BIT0ではあるのだが。
ニュアンス的に。

193:デフォルトの名無しさん
18/09/15 17:29:56.92 aC3C7hdp.net
>>187
それは俺も思ったけど、それならsignificandの方も複数じゃないとおかしいような...

194:デフォルトの名無しさん
18/09/15 20:35:40.44 UR1d6CKz.net
同様の症状を再現出来るようになったので上げる。
完全再現は出来てないが、使い物にはなるはず。興味がある人はよろしく。
症状:
単独で起動した場合と、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の結果が得られる。

195:デフォルトの名無しさん
18/09/15 20:37:06.43 UR1d6CKz.net
ソース:
#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;
}

196:デフォルトの名無しさん
18/09/15 20:42:48.06 UR1d6CKz.net
オプション等(コマンドライン):(全てデフォのままのはずだが一応)
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。

197:デフォルトの名無しさん
18/09/15 20:43:03.84 UR1d6CKz.net
備考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

198:デフォルトの名無しさん
18/09/16 02:47:43.28 wIV2HUNW.net
>>191
C++/CLR では、.Net を使っているから、起動方法が違うだけでも、
fpu control word の値や、使うCPU命令がx87 FPUなのか、SSE
なのかが違ってくる可能性がある�


199:ゥもしれない。 fpu control word は、main()関数に入る前の start up codeの中で 初期化される。



200:デフォルトの名無しさん
18/09/16 03:19:36.22 wIV2HUNW.net
>>192
// Release build
// 0.000000, 0x1ff68ddfb62221dd from IDE
// 0.000000, 0x1ff68ddfb62221de from command prompt
それにしても、随分小さな値だね。ちなみに、浮動小数点表示
の場合の有効数字の桁数を上げたら、どのようになる?
1.xxxe-yy
表示にして。

201:デフォルトの名無しさん
18/09/16 03:40:33.66 wIV2HUNW.net
>>192
試しに、ソースの冒頭に
#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) );
としてみるとどうなる?

202:デフォルトの名無しさん
18/09/16 03:42:01.82 wIV2HUNW.net
>>197
誤: printf( "%30.30e, 0x%016X\n", norm, *(__int64*)&norm) );
正: printf( "%30.30e, 0x%016X\n", norm, *(__int64*)&norm );

203:デフォルトの名無しさん
18/09/16 07:27:22.50 SOVIz+sV.net
> 0x1ff68ddfb62221dd(Debug)
> 0x1ff68ddfb62221de(Release)
VS 2010 VC++ Express でも再現した

204:デフォルトの名無しさん
18/09/16 07:38:10.70 SOVIz+sV.net
↓このループを抜けたあと、すでに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];
とりあえずまずこれだけは分かったから
低学歴知恵遅れが書いたウンココードの問題箇所を限定する

205:デフォルトの名無しさん
18/09/16 07:51:03.41 SOVIz+sV.net
①-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;
}

206:デフォルトの名無しさん
18/09/16 07:51:56.62 SOVIz+sV.net
①-1 デフォルト設定(Release)
↓このコードの逆アセンブルコード
URLリンク(ideone.com)
【実行結果】
0x0007F2C44DFFF8F2:1.1053482540585106e-308

207:デフォルトの名無しさん
18/09/16 07:53:20.79 SOVIz+sV.net
①-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;
}

208:デフォルトの名無しさん
18/09/16 08:02:12.99 SOVIz+sV.net
①-2 デフォルト設定(Release)
↓このコードの逆アセンブルコード
URLリンク(ideone.com)
【実行結果】
↓実行結果を書き込めないからこっちに書き込んどいた
URLリンク(ideone.com)
0x0007F2C44DFFF8F1:1.1053482540585101e-308

209:デフォルトの名無しさん
18/09/16 08:05:50.92 SOVIz+sV.net
②-1 最適化無効 (/Od)(Release)
※ コードは①-1(>>201)と同じ
↓このコードの逆アセンブルコード
URLリンク(ideone.com)
【実行結果】
0x0007F2C44DFFF8F1:1.1053482540585101e-308

210:デフォルトの名無しさん
18/09/16 08:09:59.78 SOVIz+sV.net
②-2 最適化無効 (/Od)(Release)
※ コードは②-2(>>203)と同じ
↓このコードの逆アセンブルコード
URLリンク(ideone.com)
【実行結果】
※ ①-2(>>204)と同じ
0x0007F2C44DFFF8F1:1.1053482540585101e-308

211:デフォルトの名無しさん
18/09/16 08:20:27.67 SOVIz+sV.net
①-1、①-2の逆アセンブルの出力結果を比較すると原型をとどめてないぐらいグチョグチョに違う(最適化のせいと考えられる)
②-1、②-2の逆アセンブルの出力結果を比較すると差異はほとんどない(②は両方ともまったく最適化されてないから当然)
①-1と②-1の逆アセンブルの出力結果を比較すると原型をとどめてないぐらいグチョグチョに違う(①-1のコード(>>201)ははげしくウンコ最適化されてると考えられる)
①-2と②-2の逆アセンブルの出力結果を比較すると差異はほとんどない(①-2のコード(>>203)はあまり最適化されてないと考えられる)
はっきりいって、これ以上見る気もしないしテキトーだが
ウンコみたいな最適化で演算の順序が入れ替わったせいで、誤差が発生しているものと考えられる

212:デフォルトの名無しさん
18/09/16 08:28:37.25 zL1WUjLu.net
>>199以降、
すまん、入れ替わりになるかもしれんが後で確認する。
まず>>195その他について回答する。
>>195
SSEは /arch:SSE または /arch:SSE2 でないと出ないことになっており、勿論設定はしていない。
また、逆アセンブル結果では x87 命令のみであるのも確認している。
ただ今回の問題は、本当にReleaseビルドのバイナリを逆アセンブルしているか怪しい事だが。
>>196
小さい値なのは偶々だ。
辿って行ってそれが1回目にヒットする入力データだっただけのこと。
>>197
.NETの書式指定はググり難いが以下。
URLリンク(docs.microsoft.com)
概ねprintfと同じで、自動的にやってくれるのが増えている。
30桁欲しければ以下。
Console::Write(String::Format("{0:E6}, {0:E30}\r\n",norm));
// 出力は 1.051355E-154, 1.051355436595307800000000000000E-154
なおdoubleは16桁な。(15.9=53*log(10)2)
ただ当たり前だが、書式を変えたところで計算結果は変わらないし、
精度の問題には関係ない。

213:デフォルトの名無しさん
18/09/16 08:29:03.14 zL1WUjLu.net
>>195
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方向への切り捨て

214:デフォルトの名無しさん
18/09/16 08:29:57.53 zL1WUjLu.net
>>195
直後のみに配置:
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(コマンドプロンプト)

以上が>>195その他に対する回答。
これから>>199その他について確認する。

215:デフォルトの名無しさん
18/09/16 12:52:37.56 haV9TZ8e.net
>>210
興味深い結果だ。

216:デフォルトの名無しさん
18/09/16 13:21:26.16 haV9TZ8e.net
>>210
>命令自体は 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 );
を使ってみたらどうなる?

217:デフォルトの名無しさん
18/09/16 13:31:15.50 Q5j4SiHR.net
win32コンソールなら結果が同じ。 もう理由は分かったのに何が問題なんだ?こんなの何の影響もないだろう。

218:デフォルトの名無しさん
18/09/16 13:33:14.92 zL1WUjLu.net
>>199
再現実験ありがとう。
しかし色々問題がある。
1. 俺は起動方法による違いについてフォーカスしているが、
 君はRelease/Debugの違いにフォーカスしている。
2. VC++2008では再現しない。(VC++2010では再現する)
3. ソース改変しすぎ。それでは意味がない。
4. >>207の結論は間違い。
まず問題なのはソースの改変だ。
ループ回数を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と同じコードだからだ。
勿論結果も同じだった。

219:デフォルトの名無しさん
18/09/16 13:33:48.22 zL1WUjLu.net
>>199
問題は、俺の環境で俺が提供したコード>>192だと、
同様に展開されないにも関わらず、『起動方法によって』結果が異なってしまう点だ。
俺の環境での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関連のことはこちらも知っている上で、質問している。

220:デフォルトの名無しさん
18/09/16 13:53:17.67 haV9TZ8e.net
>>214
なるほど、全く別の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 を読み取ってみると、不安定な値が読み出されたと。

221:デフォルトの名無しさん
18/09/16 13:58:15.86 haV9TZ8e.net
まず、
__asm{
 fnstcw [cw];
}
ではなく、_control87() を使ってみて欲しい。
インラインアセンブラは、独立した *.asm で書くより危険な場合が
あるかも知れないので。特にC関数の引数、今の場合は、「cw」を
インライン・アセンブラで用いた場合、正しいコードが出ているかどうか
は注意が必要。

222:デフォルトの名無しさん
18/09/16 14:05:28.41 haV9TZ8e.net
>>209
よく見ると、それは、かなり複雑な事情が絡みそうなコード。
以下のようにした方が安心。なお、「cw」という短すぎ�


223:驤薄シ も長年のプログラミング経験からすると、インラインアセンブラでは 怖い。また、 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



224:デフォルトの名無しさん
18/09/16 14:17:40.34 haV9TZ8e.net
あ、後、インライン・アセンブラで実験する場合は、関数名の inline は
「取った」方がいい。つまり、以下の方が安心:
#pragma unmanaged
void fpu_getcw(unsigned short *pCW) {
 __asm{
  mov edx,pCW
  fnstcw [edx];
 }
}
#pragma managed

225:デフォルトの名無しさん
18/09/16 15:23:18.78 h8nMbN0G.net
また基本に戻るが、>>193で/MDになってるので
/MTや/MTdでも発生するかしてみた方がいい

226:デフォルトの名無しさん
18/09/16 15:37:02.44 Q5j4SiHR.net
.netはx87コンテキストをすべて保持しませんって分かったんだからもう十分。
win32かx64にすれば解決。そもそも問題になる仕様バグじゃない。

227:デフォルトの名無しさん
18/09/16 15:40:56.17 haV9TZ8e.net
>>220
ホントだ。/MDだと、Runtime Library として DLL のものを使ってしまう。
これは、今回の現象に非常に重要な影響を与えているかも知れない。

228:デフォルトの名無しさん
18/09/16 15:42:36.82 haV9TZ8e.net
>>221
いや、まだまだ興味深い。
ここで終わらせずにもっと徹底して追及すべきだ。

229:デフォルトの名無しさん
18/09/16 15:48:45.63 zL1WUjLu.net
>>212
それはどうやら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.
> URLリンク(msdn.microsoft.com)
とはいえ無理矢理やってみた。警告は出るがコンパイルは通る。
結果は、どこに置いても、Debug/Releaseでも、常に 0x9001f が読み出される。
ただし、これは上記の仕様からして、当てにならない。

230:デフォルトの名無しさん
18/09/16 15:49:44.99 zL1WUjLu.net
>>219
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でもしているのか?
まあこれに当たっているのなら確実に俺のバグだし、これなら辻褄は合ってしまうのだが。

231:デフォルトの名無しさん
18/09/16 15:51:01.50 zL1WUjLu.net
>>219
なお、逆アセンブルでコードバイトを表示させて確かめることは出来る。
正しいコードは出ている。(ただし不安定)
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の一部しか使えない、ということか?

232:デフォルトの名無しさん
18/09/16 15:51:25.16 zL1WUjLu.net
>>219
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] だ。
理由は分からんがこちらだと安定しているので、結果としてはこのやり方が正しい。

233:デフォルトの名無しさん
18/09/16 16:02:47.64 haV9TZ8e.net
>>226
をを。やはり、ある意味ではVCが間違ったアセンブリコードを出していたよ。
それだと、
fnstcw [EBP+08]
という意味になってしまって、
fnstcw pCW
の意味になっている。つまり:
pCW = control_word;
あなたが、やりたいのは、
*pCW = control_word;
だったのだから、アセンブリ・コードが間違ってる。
あなたが指示したのは、
fnstcw [pCW]
だった。実際に生成されたコードは、
fnstcw pCW
だった。
VC のインラインアセンブラは、エラーも出さずに間違ったコードを
出すことが証明された。
これと、精度が不安定な問題とは全く別ではあるけれど。

234:デフォルトの名無しさん
18/09/16 16:06:05.39 zL1WUjLu.net
すまん、間違いの修正
>>225
× > どうやらこれが原因の可能性が出てきた。(はっきり言って俺のバグだが)
× > まあこれに当たっているのなら確実に俺のバグだし、これなら辻褄は合ってしまうのだが。
今回は俺はあくまで俺の本番コードのデバッグを念頭に置いていて、この発言だった。
ただし>>192の再現コードで『不定スタック領域』を掴んでいるわけもなく、
一応IDE起動とコマンドプロンプト起動での挙動の違いを再現出来ているわけだから、
これだけが問題ではないのも事実だ。
俺にとっては一つ新しい知見として、
・IDEから起動した場合、スタックが初期化されるっぽい
ということが分かった。とはいえOSは0fillしてから各プロセスにメモリを与えるので、実際は、
・コマンドプロンプト起動ならmain前に設定した続きでそのまま実行、
・IDE起動ならmain前に色々やって0fillして実行、
 或いはmain前に色々やることが多く、スタックが進み、(例えばデバッガをアタッチする為)
 結果的にOSが初期化済みの領域から始動
となって違いが発生するというところか。

235:デフォルトの名無しさん
18/09/16 16:11:52.18 haV9TZ8e.net
>>226
>正直、/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]


236: というコードにしなくてはならなかったのに、VCがある意味では間違った。 これが、単独の *.asm ではなく、VC の asm {・・・} が危険な理由。 VC の asm は特に危険。



237:デフォルトの名無しさん
18/09/16 16:17:02.07 haV9TZ8e.net
>>229
>ただし>>192の再現コードで『不定スタック領域』を掴んでいるわけもなく、
>一応IDE起動とコマンドプロンプト起動での挙動の違いを再現出来ているわけだから、
>これだけが問題ではないのも事実だ。
そうだよ。精度が変わるのはあなたの間違いではない。スタック領域が0クリア
されようがれまいが、あなたのコード自体には特に不安定さはない。
非初期化領域を参照しているコードは見当たらないし。

238:デフォルトの名無しさん
18/09/16 16:20:22.27 haV9TZ8e.net
逆アセンブラ結果を見てないで言うけど、もし、sqrt() が call文で関数呼び出し
されているんだったら、そこで精度の違いが出てるかもしれない。

239:デフォルトの名無しさん
18/09/16 16:23:20.75 zL1WUjLu.net
>>228
なるほど、了解した。
つまり、>>210は全面的に間違いで、正しくは、
・fpu control register は 0x027F で、IDEからも正しく読めている
だな。

俺がやるべきだったのは fnstcw [[cw]] なのだと思うが、これはSyntaxErrorだ。
そして、こんな命令はないから、
[]内に変数を書かず、レジスタ名にしろ、ということだったのだな。
全くもって了解だ。
VCの問題ではなくて、
俺が fnstcw [cw] と書いたのが間違いで、それをそのままコードにされてしまっただけだな。
正しく書けばSyntaxErrorだったのだし。
なお fnstcw [*cw] もSyntaxErrorだ。手動で一旦レジスタに移さないと駄目だな。
全くもって>>219のコードが正しい。

240:デフォルトの名無しさん
18/09/16 16:35:08.59 LrdaMWHl.net
>>233
>俺がやるべきだったのは 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;
としたということ。

241:デフォルトの名無しさん
18/09/16 16:36:04.13 zL1WUjLu.net
>>230-231
了解だ。ありがとう。
>>232
その部分の逆アセンブラは以下の通り。
普通にcallされている。(行数オーバーなので切るが)
ただし、
> そこで精度の違いが出てるかもしれない
との繋がりがよくからない。
sqrt()でcallされると、スタックが改変される。おそらくデータ依存か?
なら未初期化のスタックを掴みに行っているコードが有ればバグる。
ただし今回の『再現コード』はこの限りではない。
(俺の本番コードはさておき)

242:デフォルトの名無しさん
18/09/16 16:37:19.30 zL1WUjLu.net
>>232
逆アセンブラ
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]

243:デフォルトの名無しさん
18/09/16 16:37:34.94 zL1WUjLu.net
>>232
逆アセンブラ(続き)
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]

244:デフォルトの名無しさん
18/09/16 16:40:36.14 LrdaMWHl.net
>>235
よく見ると、最小(?)の実験コードでは sqrt() が使われていなかった。
スマン。

245:デフォルトの名無しさん
18/09/16 16:42:54.99 zL1WUjLu.net
>>234
ああ、なるほど、了解。

246:デフォルトの名無しさん
18/09/16 16:49:54.65 zL1WUjLu.net
>>238
いや、俺が提供した>>192のソースなら使われてるぞ。
>>201のソースでは使われてないが。
ただまあ、彼(200)がsqrtを落としたのも分からなくはない。
誤差が生じる=通常は桁落ちだから、この場合は当然積和部分が怪しい。
あらかじめ彼はそうなると分かっていてそれを落とし、予定調和的な結論にたどり着いてしまった。
それが彼の間違いだった、ということ。
俺は出来るだけ元のソースのままで追跡しようとしている。
元のソースの該当ケースと離れてしまっては意味がないから。
そして元ソースではsqrtを使っている。

247:デフォルトの名無しさん
18/09/16 16:53:58.12 /oSJzlqn.net
たぶん2008の最適化ミスだと思う。
static double norm = 0;// ←"static"を追加する
にするとか、最適化オプションをいじると
Release/コマンドプロンプトからの起動でも
0x1ff68ddfb62221ddになる

248:デフォルトの名無しさん
18/09/16 16:54:10.71 LrdaMWHl.net
>>238
ああ。また訂正。
sqrt()が使われていないのは、>>201, >>202, >>203, >>204 の場合で、
それは、ループ内にfprintf()を入れた場合と入れない場合とで、
x87 fpuレジスタのst(0)~st(7)を使う「期間」が変わるために 80BITから
64BITへの書き戻し丸めの問題のために精度が変わっているだけだった。
一方、あなたが指摘した >>192 では、ちゃんと sqrt() 関数が使われていて、
それだと、IDEからの起動とコマンド・プロンプトからの起動とで、精度が変
わってくると。そして、その場合の逆アセンブル結果は >>236 のように
sqrt() 関数がその場で x87 fpu の fsqrt 命令を使わずに、call 文によって
実際に本当のサブ・ルーチンを呼び出していると。
これはとても興味深い。そのサブ・ルーチンの中が、時と場合によって
精度が変わってくるような書き方をされている可能性が見えてきた。

249:デフォルトの名無しさん
18/09/16 16:56:42.67 LrdaMWHl.net
>>240
>いや、俺が提供した>>192のソースなら使われてるぞ。
> >>201のソースでは使われてないが。
了解。
問題を切り分けるため、sqrt() を使わなかった場合の Release版での、
IDE起動とコマンドrライン起動の精度の違いを実験してみて欲しい。

250:デフォルトの名無しさん
18/09/16 17:02:35.56 LrdaMWHl.net
ちょっとしばらく、ここを離れる。

251:デフォルトの名無しさん
18/09/16 17:22:07.21 zL1WUjLu.net
>>241
現象確認した。こちらでも再現した。
逆アセンブルは、以下。(肝心のループ部分は次レス内)
正直、fld/fmul/fadd/fstpのループ部分は変わらず、
normのアドレスが [ebp-10h](つまりローカル)から
ds:[00A4AD40h](つまりグローバル)に変わっただけであり、
これで結果が変わるのはかなり奇妙な気もするが、何か見落としがあるのかも。
>>241逆アセンブル(static付加版)
template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug.
static double norm = 0;
for (int i=0;i<num;i++) norm += (double)r[i] * (double)r[i];
00000000 55 push ebp
00000001 8B EC mov ebp,esp
00000003 83 EC 20 sub esp,20h
00000006 89 4D FC mov dword ptr [ebp-4],ecx
00000009 89 55 F8 mov dword ptr [ebp-8],edx
0000000c 83 3D 14 2E 38 00 00 cmp dword ptr ds:[00382E14h],0
00000013 74 05 je 0000001A
00000015 E8 FF 52 30 68 call 68305319
0000001a 33 D2 xor edx,edx
0000001c 89 55 F0 mov dword ptr [ebp-10h],edx
0000001f 33 D2 xor edx,edx
00000021 89 55 F4 mov dword ptr [ebp-0Ch],edx
00000024 D9 EE fldz
00000026 DD 5D E8 fstp qword ptr [ebp-18h]
00000029 33 D2 xor edx,edx
0000002b 89 55 F0 mov dword ptr [ebp-10h],edx
0000002e 90 nop
0000002f EB 03 jmp 00000034

252:デフォルトの名無しさん
18/09/16 17:22:29.32 zL1WUjLu.net
>>241逆アセンブル(続き)(static付加版)
00000031 FF 45 F0 inc dword ptr [ebp-10h]
00000034 8B 45 F0 mov eax,dword ptr [ebp-10h]
00000037 3B 45 FC cmp eax,dword ptr [ebp-4]
0000003a 7D 21 jge 0000005D
0000003c 8B 45 F8 mov eax,dword ptr [ebp-8]
0000003f 8B 55 F0 mov edx,dword ptr [ebp-10h]
00000042 DD 04 D0 fld qword ptr [eax+edx*8]
00000045 8B 45 F8 mov eax,dword ptr [ebp-8]
00000048 8B 55 F0 mov edx,dword ptr [ebp-10h]
0000004b DC 0C D0 fmul qword ptr [eax+edx*8]
0000004e DC 05 40 AD A4 00 fadd qword ptr ds:[00A4AD40h]
00000054 DD 1D 40 AD A4 00 fstp qword ptr ds:[00A4AD40h]
0000005a 90 nop
0000005b EB D4 jmp 00000031
norm = sqrt(norm);
0000005d DD 05 40 AD A4 00 fld qword ptr ds:[00A4AD40h]
00000063 83 EC 08 sub esp,8
00000066 DD 1C 24 fstp qword ptr [esp]
00000069 E8 0E 50 88 FF call FF88507C
0000006e DD 5D E0 fstp qword ptr [ebp-20h]
00000071 DD 45 E0 fld qword ptr [ebp-20h]
00000074 DD 1D 40 AD A4 00 fstp qword ptr ds:[00A4AD40h]

253:デフォルトの名無しさん
18/09/16 17:22:46.06 zL1WUjLu.net
>>241逆アセンブル(続き)(static付加版)
if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm);
0000007a 0F B6 45 08 movzx eax,byte ptr [ebp+8]
0000007e 85 C0 test eax,eax
00000080 74 28 je 000000AA
00000082 33 D2 xor edx,edx
00000084 89 55 F4 mov dword ptr [ebp-0Ch],edx
00000087 90 nop
00000088 EB 03 jmp 0000008D
0000008a FF 45 F4 inc dword ptr [ebp-0Ch]
0000008d 8B 45 F4 mov eax,dword ptr [ebp-0Ch]
00000090 3B 45 FC cmp eax,dword ptr [ebp-4]
00000093 7D 15 jge 000000AA
00000095 8B 45 F8 mov eax,dword ptr [ebp-8]
00000098 8B 55 F4 mov edx,dword ptr [ebp-0Ch]
0000009b DD 05 40 AD A4 00 fld qword ptr ds:[00A4AD40h]
000000a1 DC 3C D0 fdivr qword ptr [eax+edx*8]
000000a4 DD 1C D0 fstp qword ptr [eax+edx*8]
000000a7 90 nop
000000a8 EB E0 jmp 0000008A
return norm;
000000aa DD 05 40 AD A4 00 fld qword ptr ds:[00A4AD40h]
000000b0 DD 5D E8 fstp qword ptr [ebp-18h]
}
000000b3 DD 45 E8 fld qword ptr [ebp-18h]
000000b6 8B E5 mov esp,ebp
000000b8 5D pop ebp
000000b9 C2 04 00 ret 4

254:デフォルトの名無しさん
18/09/16 17:35:35.70 zL1WUjLu.net
>>243
まだ異なった出力が得られた。
この意味では200がsqrtを外した判断は正しかった。
(彼はそこからさらにループ回数を固定してしまったのが間違いだった)
191ソースを以下に変更した。(sqrtをコメントアウト)
ついでに Console::Write(String::Format("{0:E6}, {0:E30}\r\n",norm)); の出力も付けておく。
ソース:
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;
}
結果:(Releaseビルド/コマンドプロンプトからの起動)
0.000000, 0x0007f2c44dfff8f2
1.105348E-308, 1.105348254058510600000000000000E-308
結果:(Releaseビルド/IDEからの起動、Debugビルドは起動方法によらずこちら)
0.000000, 0x0007f2c44dfff8f1
1.105348E-308, 1.105348254058510100000000000000E-308

>>244
了解。いずれにしても助かってる。
こちらも後30分くらいでちょっと離れる予定。

255:デフォルトの名無しさん
18/09/16 18:30:34.19 HF0YmRsW.net
>>213
ほんそれ

256:デフォルトの名無しさん
18/09/16 20:54:27.39 zL1WUjLu.net
>>241
さて再見したが、やはりstaticだけで直る理由は分からない。
なお、最適化ミスの場合は、逆アセンブラを読めば分かる。
今のところそれではない。
一応、>>192ソースのtemplate部の逆アセンブルを上げておく。(ただし重複するので頭のみ)
頭はこれ。続きが>>236,237。
template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug.
double norm = 0;
00000000 55 push ebp
00000001 8B EC mov ebp,esp
00000003 83 EC 28 sub esp,28h
00000006 89 4D FC mov dword ptr [ebp-4],ecx
00000009 89 55 F8 mov dword ptr [ebp-8],edx
0000000c 83 3D 14 2E 76 00 00 cmp dword ptr ds:[00762E14h],0
00000013 74 05 je 0000001A
00000015 E8 FF 52 1B 68 call 681B5319
0000001a 33 D2 xor edx,edx
0000001c 89 55 E8 mov dword ptr [ebp-18h],edx
0000001f 33 D2 xor edx,edx
00000021 89 55 EC mov dword ptr [ebp-14h],edx
00000024 D9 EE fldz
00000026 DD 5D F0 fstp qword ptr [ebp-10h]
00000029 D9 EE fldz
0000002b DD 5D E0 fstp qword ptr [ebp-20h]
0000002e D9 EE fldz
00000030 DD 5D F0 fstp qword ptr [ebp-10h]

257:デフォルトの名無しさん
18/09/16 21:25:23.90 zL1WUjLu.net
>>220
>>222
/MTと/clrは同時に指定出来ないらしい。(error D8016)
/MTdも同じく無理。
もう一つ /MDd ってのがあるから試してみた。
/MDdの結果:
Releaseビルドでコマンドプロンプト起動の時のみ ****de、
ReleaseビルドでIDEからの起動だと ***dd。(Debugビルドは起動方法を問わずこっち)
(/MDと全く挙動は同じ)

これで有効な指摘については全て回答してるかな?
見落としが有れば指摘よろしく。
(規制に引っかかったので遅くなってすまん)

今のところ、可能性があるのは以下か?
・Releaseビルドをコマンドプロンプトから起動したときのみなぜか精度が高い
 (>>201から結果的に検出された。今のところ精度が高いときと同じ挙動をしている為)
・ReleaseビルドもIDEから起動すれば結果的にスタックが0初期化されている状態になっており、
 俺の本番プログラムに関してはここに当たるバグがある?(>>229)
 (ただしこれは>>192には該当しない)

258:240
18/09/16 21:43:04.47 /oSJzlqn.net
.netの場合、デバッガ配下では(デバッグのため)違うコードを実行しているような気がする。
デバッガの逆アセンブル表示とかasm出力はあまり当てにならないような気もする。
ループ部分だけど、レジスタのみで処理するか、メモリを使用するかで精度が変わるのかも。
そもそも、どっちが正しいのかよくわからんけど...
ループ部分の関数を#pragma unmanagedすると結果が変わるでそれが正しいのかも。

259:240
18/09/16 21:43:27.78 /oSJzlqn.net
static版
0000000e 33 C0 xor eax,eax
00000010 85 F6 test esi,esi
00000012 7E 16 jle 0000002A
00000014 DD 04 C7 fld qword ptr [edi+eax*8]
00000017 DC C8 fmul st(0),st
00000019 DC 05 00 30 CC 00 fadd qword ptr ds:[00CC3000h]
0000001f DD 1D 00 30 CC 00 fstp qword ptr ds:[00CC3000h]
00000025 40 inc eax
00000026 3B C6 cmp eax,esi
00000028 7C EA jl 00000014
0000002a DD 05 00 30 CC 00 fld qword ptr ds:[00CC3000h]
非static版
0000000e D9 EE fldz
00000010 33 C0 xor eax,eax
00000012 85 F6 test esi,esi
00000014 7E 0C jle 00000022
00000016 DD 04 C7 fld qword ptr [edi+eax*8]
00000019 DC C8 fmul st(0),st
0000001b DE C1 faddp st(1),st
0000001d 40 inc eax
0000001e 3B C6 cmp eax,esi
00000020 7C F4 jl 00000016

260:デフォルトの名無しさん
18/09/16 22:27:34.58 zL1WUjLu.net
>>252
とりあえず落ち着け。一つずつ行こう。
> ループ部分の関数を#pragma unmanagedすると結果が変わるでそれが正しいのかも。
こちらでも確認した。
calc_norm_and_regulateをunmanaged関数にすると、違いはなくなる。
(Releaseビルドの`をコマンドプロンプトで起動した際にも、****ddの結果となる)
ただしこちらの逆アセンブル結果は以下だ。(fld/fmul/fadd/fstpであることに注意)
for (int i=0;i<num;i++) norm += (double)r[i] * (double)r[i];
0007272C C7 45 F4 00 00 00 00 mov dword ptr [i],0
00072733 EB 09 jmp `anonymous namespace'::calc_norm_and_regulate<double>+1Eh (7273Eh)
00072735 8B 45 F4 mov eax,dword ptr [i]
00072738 83 C0 01 add eax,1
0007273B 89 45 F4 mov dword ptr [i],eax
0007273E 8B 4D F4 mov ec


261:x,dword ptr [i] 00072741 3B 4D 08 cmp ecx,dword ptr [num] 00072744 7D 1A jge `anonymous namespace'::calc_norm_and_regulate<double>+40h (72760h) 00072746 8B 55 F4 mov edx,dword ptr [i] 00072749 8B 45 0C mov eax,dword ptr [r] 0007274C 8B 4D F4 mov ecx,dword ptr [i] 0007274F 8B 75 0C mov esi,dword ptr [r] 00072752 DD 04 D0 fld qword ptr [eax+edx*8] 00072755 DC 0C CE fmul qword ptr [esi+ecx*8] 00072758 DC 45 F8 fadd qword ptr [norm] 0007275B DD 5D F8 fstp qword ptr [norm] 0007275E EB D5 jmp `anonymous namespace'::calc_norm_and_regulate<double>+15h (72735h)



262:デフォルトの名無しさん
18/09/16 22:33:32.07 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は何故か直ってしまった。

263:デフォルトの名無しさん
18/09/16 22:34:16.44 zL1WUjLu.net
>>253
> .netの場合、デバッガ配下では(デバッグのため)違うコードを実行しているような気がする。
> デバッガの逆アセンブル表示とかasm出力はあまり当てにならないような気もする。
これは俺も相当疑っているのだが、今のところ尻尾を掴めない。
ILspyだっけ?外部の逆アセンブルツール使えばチェック出来るのかな?
いずれにしても、>>252の指摘
・unmanagedにすれば直る
のも事実だし、逆アセンブルを見る限り、これを説明出来る理由もないのも事実。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch