double, 100で割ってから100倍する – 固定ページ 2 – プログラミング – Home

double, 100で割ってから10...
 
通知
すべてクリア

double, 100で割ってから100倍する

固定ページ 2 / 2

pen
 pen
(@pen)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

ありがとうございます。とても勉強になりました。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> -O3については、そもそもtest(b)の呼出はせず、
> そもそも浮動小数点関連の計算すら一切行わずに直接1を
> 出力しています。
> コンパイル時にすべての計算を終えてしまい、その際、
> 2 と 2 / 100.0 * 100.0 は同一だと判定したのでしょう。
最近のコンパイラはそこまでやるか!

> なぜ結果が一定しないかを考えるのは楽しいですが、
御意。


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

完全に余談ですが

>最近のコンパイラはそこまでやるか!
なんかで、
int fac(int n){
if(n<=1)
return 1;
else
return fac(n-1)*n;
}
を作ってfac(5)とか書いたら最適化で全部展開されて定数になって出たって話も
聞いた覚えが…

最適化による計算内容の変動も面白いものがありますよね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

>最近のコンパイラはそこまでやるか!

最近のコンパイラの最適化はかなり賢いので
人間がアセンブラで組むよりもよっぽど速かったりしますね。
昔のコンパイラだと高速化が必要とかだとアセンブラ必須でしたけど。
今のコンパイラだと相当の達人で無いと人間が負けるんじゃないかなぁ。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

余談は続く。

> 今のコンパイラだと相当の達人で無いと人間が負けるんじゃないかなぁ。
確かにそうですね。
インテルのコンパイラなんてHT用に命令の順序を変更するなんてことも聞いていますし。
この辺になるとCPUの内部アーキテクチャーが分からないとどうにもならない。

ところで、今回の件で、
> double e = test(b);
> cout << (c == e) << endl;
> cout << (c == test(b)) << endl;
の e に volatile をつけるとコンパイルすると、どうなるんでしょう。
ちょっと興味があります。
# gcc は入っていないので...


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

余談です。

> 今のコンパイラだと相当の達人で無いと人間が負けるんじゃないかなぁ。
>> 確かにそうですね。
>> インテルのコンパイラなんてHT用に命令の順序を変更するなんてことも聞いています
>> し。
>> この辺になるとCPUの内部アーキテクチャーが分からないとどうにもならない。
日立系のCPU(H8,SH,SH2,SH3,SH4)はC言語が優勢ですね。
PIC/AVR関連も言語が使えるようになってます。
# 僕はPICのC言語にいまいち慣れてないです。
アセンブラは、単純動作でスピード重視の部分に限られるようになるのかも
知れませんね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> アセンブラは、単純動作でスピード重視の部分に限られるようになるのかも
> 知れませんね。

下手するとそういう領域もコンパイラが吐き出すコード十分と言う事にも
なりかねませんね。
こっちの方面の職人は段々需要が無くなっていくのかも。
コンパイラを書くような人たちは話が別なんでしょうけれど。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

さらに余談は続く。

> アセンブラは、単純動作でスピード重視の部分に限られるようになるのかも
> 知れませんね。
電力関係などの特に高信頼性が求められる分野では、組み込みソフトウェアのバグ修正の際に
新旧ROMの照合を行なって修正した部分以外に変更が無いことの確認が求められることがある
そうです。
このような場合、アセンブラでないとなかなか難しいのではないかとも思います。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました