14/10/13 15:13:20.18 yFRqmPNp.net
■公式
URLリンク(www.microsoft.com)
■前スレ
Visual Studio 2008 Part 21
スレリンク(tech板)
■リンク
Visual Studio 2008に搭載された17の新機能
URLリンク(www.atmarkit.co.jp)
5000個のバグと戦った、MSが「Visual Studio 2008」RTM出荷
URLリンク(www.atmarkit.co.jp)
■関連
Visual Studio 2013 part4
スレリンク(tech板)
Visual Studio 2012 Part8
スレリンク(tech板)
Visual Studio 2010 Part21
スレリンク(tech板)
Visual Studio 2005 Part 27
スレリンク(tech板)
その他テンプレ>>2-5
2:デフォルトの名無しさん
14/10/13 15:18:37.82 Dm7iIvJX.net
ノ ゚.ノヽ , /} ...
,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは>>1乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. :::
3:デフォルトの名無しさん
14/10/14 09:40:56.89 yI2xaj4J.net
>>1 乙
4:デフォルトの名無しさん
14/10/14 09:42:38.35 yI2xaj4J.net
Visual Studio 2008 Express Edition の DVD イメージからのインストール
URLリンク(www.microsoft.com)
・sp1適用済み
URLリンク(download.microsoft.com)
・無印
URLリンク(download.microsoft.com)
Microsoft Visual Studio 2008 Service Pack 1 (iso)
URLリンク(www.microsoft.com)
URLリンク(download.microsoft.com)
ダウンロードの詳細 : MSDN Library for Visual Studio 2008 SP1:
URLリンク(www.microsoft.com)
Microsoft Visual Studio International Pack 1.0 SR1
URLリンク(www.microsoft.com)
5:デフォルトの名無しさん
14/10/14 09:44:28.01 yI2xaj4J.net
Visual Studio Team System 2008 Test Agent 評価版
URLリンク(www.microsoft.com)
Visual Studio 2008 Professional Edition 90日間 限定評価版
URLリンク(www.microsoft.com)
Visual Studio Team System 2008 Team Suite, Visual Studio Team System 2008 Team Foundation Server, SQL Server 2005 評価キット
URLリンク(www.microsoft.com)
Visual Studio Team System 2008 Team Suite (90 日間評価版)
URLリンク(www.microsoft.com)
Visual Studio Team System 2008 Team Suite リリース ノート
URLリンク(download.microsoft.com)
Visual Studio Team System 2008 Team Foundation Server (90 日間評価版)
URLリンク(www.microsoft.com)
URLリンク(download.microsoft.com)
Visual Studio Team System 2008 Test Load Agent (90 日間評価版)
URLリンク(www.microsoft.com)
Visual Studio 2008 Professional Edition (90 日間評価版)
URLリンク(www.microsoft.com)
6:デフォルトの名無しさん
14/10/14 09:45:51.34 yI2xaj4J.net
Microsoft Visual Studio 2008 Service Pack 1 (インストーラ)
URLリンク(www.microsoft.com)
Visual Studio 2008 Shell (isolated mode) Service Pack 1 再頒布可能パッケージ
URLリンク(www.microsoft.com)
Microsoft Visual Studio 2008 Shell (isolated mode) 再頒布可能パッケージ
URLリンク(www.microsoft.com)
Microsoft Visual Studio 2008 Express Edition SP1
URLリンク(www.microsoft.com)
Visual Studio 2008 Team Foundation Server Service Pack 1
URLリンク(www.microsoft.com)
URLリンク(download.microsoft.com)
インテリセンス日本語対応
URLリンク(code.msdn.microsoft.com)
URLリンク(code.msdn.microsoft.com)
7:デフォルトの名無しさん
14/10/14 09:47:09.34 yI2xaj4J.net
■過去スレ
スレリンク(tech板) 【Orcas】 Visual Studio 2007 【.NET3.0】
スレリンク(tech板) 【Orcas】 Visual Studio 2008 【.NET3.5】 Part2
スレリンク(tech板) 【Orcas】 Visual Studio 2007 【.NET3.0】 Part3
スレリンク(tech板) (実質4) Visual Studio 2008 Part1
スレリンク(tech板) 【Orcas】 Visual Studio 2008 【.NET3.5】 Part5
スレリンク(tech板) Visual Studio 2008 Part 6
スレリンク(tech板) Visual Studio 2008 Part 7
スレリンク(tech板) Visual Studio 2008 Part 8
スレリンク(tech板) Visual Studio 2008 Part 9
スレリンク(tech板) Visual Studio 2008 Part 11
スレリンク(tech板) Visual Studio 2008 Part 12
スレリンク(tech板) Visual Studio 2008 Part 13
スレリンク(tech板) Visual Studio 2008 Part 14
スレリンク(tech板) Visual Studio 2008 Part 15
スレリンク(tech板) Visual Studio 2008 Part 16
スレリンク(tech板) Visual Studio 2008 Part 17
スレリンク(tech板) Visual Studio 2008 Part 18
スレリンク(tech板) Visual Studio 2008 Part 19
スレリンク(tech板) Visual Studio 2008 Part 20
スレリンク(tech板) Visual Studio 2008 Part 21
8:デフォルトの名無しさん
14/10/14 09:58:41.86 Ruv4zrCO9
おねむ
9:デフォルトの名無しさん
14/10/18 14:36:10.44 mzkaImX0.net
Microsoft、「Python Tools for Visual Studio」v2.1を正式公開
URLリンク(www.forest.impress.co.jp)
10:デフォルトの名無しさん
14/10/20 09:48:36.53 eWr20XAi.net
WindowsのExplorerで「やり直し」と「元に戻す」の機能がありますが
その具体的な内容が判らないので「何をやり直すのか」「何が元に戻るのか」が判りません
XPのときはSP3あたりから編集メニュー上にマウスカーソルを持っていくとステータスバーに内容が表示されていました
Windows7も編集メニューの方ではなくファイル一覧の何もないところで右クリックでコンテキストメニューを出すと
「やり直し」と「元に戻す」があってそこにカーソルを持っていくとステータスバーに出て来るようになりました
Windows8になるとまたエクスプローラーが先祖返りしてステータスバーに何も表示されません
なんでこんな糞設計のまま放置プレイなんでしょうか?
11:デフォルトの名無しさん
14/10/21 11:55:27.85 c4wBsC2+.net
なんでこんなスレチのまま放置プレイなんでしょうか?
12:デフォルトの名無しさん
14/10/22 20:53:01.19 RtNwyOkD.net
>>9
2008じゃ動かないじゃないか
13:デフォルトの名無しさん
14/10/23 02:37:50.57 QsQhyUlJ.net
改造記事出ないかな
14:デフォルトの名無しさん
14/10/23 13:58:03.03 ISc0F2Qf.net
OLEオブジェクトにゼロデイ脆弱性、Microsoftが暫定対策プログラムを公開
URLリンク(www.forest.impress.co.jp)
15:デフォルトの名無しさん
14/11/08 16:20:15.32 qwvGzBPO.net
CH3COOH
16:デフォルトの名無しさん
14/11/09 13:49:46.14 CgCMrjjx.net
酢酸
17:デフォルトの名無しさん
14/11/12 00:56:26.44 MpcbuGKw.net
波動砲
18:デフォルトの名無しさん
14/12/12 12:20:12.75 r3Fvlg1D.net
結局、MS Office は .NET では書かれないんだからな。そりゃCOMとOLEが残るわな。
19:デフォルトの名無しさん
15/01/29 11:54:57.76 /eP3JLu1.net
cprintf("5パーセントの税金表を表示します\n\r");
なぜだか、文字化けしてしまいます
どうしてですか?
20:デフォルトの名無しさん
15/01/29 13:18:53.41 4vB8OE29.net
Visual C++ 2005以降では、cprintf(POSIX関数)は使用しないでください。代わりにISO C++準拠の_cprintfまたはセキュリティが強化された_cprintf_sを使用してください。
21:デフォルトの名無しさん
15/01/29 15:26:23.35 M2LDD2Vs.net
表
22:デフォルトの名無しさん
15/01/29 15:48:06.22 TYTLl9KK.net
cprintf("5パーセントの税金表\を表\示します\n\r");
23:デフォルトの名無しさん
15/01/29 16:16:06.27 /eP3JLu1.net
>>20
ありがとうございます
24:デフォルトの名無しさん
15/02/01 22:15:07.49 nTuiDhsV.net
それより「\r\n」じゃないとこが気にかかる
25:デフォルトの名無しさん
15/02/02 05:23:01.31 F4i4W5v0.net
returnとnewlineは何方が先でも結果は同じだろう
26:デフォルトの名無しさん
15/02/02 10:39:22.67 Tt8Kn9ql.net
コマンドとして実行したときは、同じ結果になるけど
行数をカウントするソフトなどでバイナリ比較したとき、不具合になる可能性がある
27:デフォルトの名無しさん
15/02/02 11:03:11.11 aNzESmLd.net
>>25
CR(キャリッジリターン)とLF(ラインフィード)ね
28:デフォルトの名無しさん
15/02/03 10:11:19.78 gImhcImv.net
復帰と改行か
29:デフォルトの名無しさん
15/02/03 13:43:33.85 X9lq6WsC.net
\x0D\x0A
30:デフォルトの名無しさん
15/02/03 14:28:12.82 orcEUXbE.net
ODAは大事だよね!
31:デフォルトの名無しさん
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]