C++相談室 part166 (435レス)
1-

411: デフォルトの名無しさん (オイコラミネオ MMdd-15C+) [sage] 2025/06/20(金) 21:06:32.84 ID:80Iion+LM(1/2) AAS
いずれにせよ結果を使わないなら最適化で丸々消される
412
(1): デフォルトの名無しさん (ワッチョイ 0175-Is3k) [] 2025/06/20(金) 21:12:56.63 ID:BxPKXrVj0(4/4) AAS
>>409
409(1): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 20:44:54.01 ID:ykKOKnwYM(2/7) AAS
保証されます。
ただしバグがなければ
413
(1): デフォルトの名無しさん (オイコラミネオ MMdd-15C+) [sage] 2025/06/20(金) 21:18:29.51 ID:80Iion+LM(2/2) AAS
最適化の時点でコードが消されるので直に0で除算をするとコンパイルエラー

変数に突っ込んでるとコンパイル可能で実行してもその部分は最適化され消されてるのでゼロ除算にならない
もちろんconstにしててもコンパイルエラー
414: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 21:43:49.77 ID:ykKOKnwYM(3/7) AAS
>>412
それは、ユーザープログラムのバグではなく、コンパイラのバグだ。
コンパイラにバグが無ければ、四則演算や&,|,~,^,&&,||などと
括弧の組み合わせた結果は、最適化しても変わらない。
0除算に関しては話が別。
415
(1): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 21:48:47.56 ID:ykKOKnwYM(4/7) AAS
最適化されて変わる可能性があるのは、今思い出せるのは、
・初期化してない変数の中身
・変数のアドレス
・結果を利用せず、副作用も伴わない式の存在。
整数に対する四則演算を含めた「計算」は、仕様が決められているので、
同じコンパイラと同じターゲット(OS、環境)だと最適化しても
結果は変わらない。
浮動小数点に対する計算は誤差の範囲で結果が変化する可能性はある。
416
(2): デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 22:25:10.37 ID:ykKOKnwYM(5/7) AAS
>>415
1. 整数の計算途中に「桁あふれ」が起きる場合はこの限りではないかも知れない。
 例えば、整数型 a に対して、a * 100 / 5 は、a * 20 と最適化できる
 可能性がある。しかし a がとても大きい場合には結果は同じにはならない可能性がある。このことに
 関して仕様がどうなっているかは知らない。
2. 浮動小数点型の変数 a に対して、(a * 100.0) / 5.0 は、
 a * 20.0 と最適化できる可能性があるが、浮動小数点型には計算誤差があるので、
 誤差の範囲内で異なる結果になる可能性があるかもしれない。
 これに対して仕様上、最適化していいかどうか走らない。
3. しかし、整数型
417: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [] 2025/06/20(金) 22:25:52.67 ID:ykKOKnwYM(6/7) AAS
>>416
3. しかし、整数型変数 a に対して、(a / 100) * 100 は、
 明らかに
418: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/20(金) 22:26:34.77 ID:ykKOKnwYM(7/7) AAS
>>416
3. しかし、整数型変数 a に対して、(a / 100) * 100 は、
 明らかに a とは、結果が異なる。だから a と最適化される事は無い。
419
(1): デフォルトの名無しさん (ワッチョイ 1279-T1jw) [] 2025/06/21(土) 01:51:51.86 ID:bIqfBqmB0(1) AAS
キミは色々と勘違いをしているからこの手の話をしたいならもうちょい勉強しよう
aが何だろうがa*100/5をa*20とはそもそも出来ないし、2.も同様
3.もaの値によっては演算の前後で値がおなじケースがある
色々あるのでいちいち書かなかったが、例えばaが10の倍数の時、aの絶対値が9以下の時、またaが列挙型だったり配列の添字だったりする時は挙動が推測出来るケースも出てくる
他にも最適化で実行時の演算をしなくてすむケースがある
演算をしなくてもaの値を変えることは出来うるし、その場合除算の代わりにいくつかの分岐や直値に変わるだろう
420: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 02:46:24.26 ID:myS4seE9H(1/7) AAS
また空気読めない書き込みする。ずっと議論
が続いているけど興味ない。

そもそも実数データを表現するbit数が有限
なんだけど(doubleで8byte=64bit)、そりゃあ
場合によっては結果が違うが、実数の場合は
それほど問題じゃない。誤差の範囲内。

整数演算の方が問題。
i=32767/10000*10000の演算やったらどう
なるか?これはコンパイラの最適化の問題
じゃなくてプログラムする人が気をつける
べきことだと思う。というか、変な最適化
はしない方がいいと思う。最適化しなくても
現在のコンピュータ能力じゃあ大して時間差
は問題にならん。

それよりも行列演算でNRVOを実装してほしい。
gccの一部では実装されているみたいだけど。
421: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 02:49:22.52 ID:myS4seE9H(2/7) AAS
あ、言い忘れた。演算子のオーバーロードでの話ね。
422: デフォルトの名無しさん (ワッチョイ 01de-Ni2x) [sage] 2025/06/21(土) 06:20:55.55 ID:mM+iEPSf0(1) AAS
>>413
0除算は未定義動作だから、(0除算については)最適化されてエラーが出なくてもC++規格通りかね。
423: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 08:07:57.88 ID:myS4seE9H(3/7) AAS
浮動小数点演算で問題になるのは情報落ち(桁落ち)。
expを指数関数としてexp(x)+exp(-x)でxの絶対値が
大きくなるとどうなるか?4倍精度演算が標準として
ほしい。fortranには昔からある。たしか南米の人が
C++で4倍精度演算ライブラリ作ってた気がする。
424
(3): デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 08:14:50.36 ID:myS4seE9H(4/7) AAS
ところで、前から気になってたけど何でワイだけ
ワッチョイ出ないんだろ。メール設定ミス?それとも
プロバイダの問題?目立つから困る。
425: デフォルトの名無しさん (ワッチョイ 71a6-Y+Ow) [sage] 2025/06/21(土) 09:45:45.70 ID:cFB8HkI30(1) AAS
signedのオーバーフローは未定義だがunsignedのオーバーフローは定義されてる
あとC/C++はfenvで浮動小数点コプロセッサのモードを切り替えられるから、それを使うつもりのコードはコンパイル時に計算されると狂ったりはする
426
(1): デフォルトの名無しさん (アウアウウー Sacd-xHx3) [sage] 2025/06/21(土) 11:27:06.14 ID:fGhLJfIJa(1) AAS
>>424
ワッチョイと同じ役割を持つ名前一覧
1) オイコラミネオ
2) ササクッテロ
3) オッペケ
4) エムゾネ
5) スプー・スプッ

JPは知らん
427: デフォルトの名無しさん (オイコラミネオ MMdd-Rgxs) [sage] 2025/06/21(土) 11:46:04.84 ID:pKk6RtsPM(1) AAS
>>419
あなたは馬鹿。
数学的センスが無いので、勉強しても直らないだろう。
428: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 12:00:57.87 ID:myS4seE9H(5/7) AAS
>>426
レスありがとう。プロバイダが関係してるのかな
429: デフォルトの名無しさん (アウアウウー Sacd-dpHj) [] 2025/06/21(土) 13:55:21.38 ID:xPq+xj/ja(1) AAS
>>424
VPNでも使ってるんだろ
430: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 14:01:54.99 ID:myS4seE9H(6/7) AAS
VPNオンだと5chが書き込み拒否する。まあ、いいか。
431
(1): デフォルトの名無しさん (ワッチョイ 6e59-dswa) [sage] 2025/06/21(土) 15:02:17.15 ID:S2983oYI0(1) AAS
>>424
出てるじゃん JPって
大方逆引き不可なホストだろうからプロバイダの問題ではある
マイナーすぎて細かく設定してないだけかも知れないけど
432: デフォルトの名無しさん (JP 0H46-E6Ax) [] 2025/06/21(土) 15:34:31.30 ID:myS4seE9H(7/7) AAS
>>431
レスありがとうございます。本スレの趣旨に合わないので
以後の返事は控えさせていただきます。
433
(1): デフォルトの名無しさん (オイコラミネオ MMc6-Rgxs) [sage] 2025/06/21(土) 16:15:28.70 ID:kXnmGuVNM(1/2) AAS
先の話題について、コンピュータではなく数学の世界まで振り返って考えてみると、
(1) a が実数の時
a * 100 / 100 = a
は恒等的に成り立つ。だからこの最適化は、精度を無視すれば
していい可能性が高い。
(2) a が整数で、整数としての割り算で考える場合、
a * 100 / 100 = a
は、一般的には成り立たない。
だから、a * 100 / 100 を a と最適化することはそもそも出来ない。
434: デフォルトの名無しさん (オイコラミネオ MMc6-Rgxs) [sage] 2025/06/21(土) 16:16:35.17 ID:kXnmGuVNM(2/2) AAS
>>433
重大な訂正。
(2)は正しくはこう :
(a / 100) * 100 = a
は、一般的には成り立たない。
だから、(a /100) * 100 を a と最適化することはそもそも出来ない。
435: デフォルトの名無しさん (ワッチョイ b295-m2eM) [] 2025/06/21(土) 16:40:28.18 ID:Kar31VLO0(1) AAS
分かったからもういいって
対人論証するようなのの意見は誰も聞かんよ
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.028s*