2012-02-02 10 views
1

数学定数を二重値として定義するのは理にかなっていますが、倍精度ではなく浮動小数点値が必要な場合はどうなりますか?コンパイラはコンパイル時にdouble型を浮動小数点として自動的に解釈しますか(つまり、浮動小数点型浮動小数点数として扱われるため)、またはこの変換は実行時に行われますか?コンパイル時にconst double castが使用されていますか?

+0

どのコンパイラ? – SQLMason

+1

分かりやすいコンパイラは、コンパイル時に定数の変換を行います。 –

+0

まあ、私の経験によれば、そこには賢明ではないコンパイラもあります:P実行時の変換を避けるために、適切な型を使用してください。 –

答えて

2

"定義" で、あなたは#defineを使用することを意味する場合は、ここでは何が起こるかです:

は、あなたが持っていると言う:あなたが持っている場合

#define CONST1 1.5 
#define CONST2 1.12312455431461363145134614 // Assume some number too 
              // precise for float 

は今:

float x = CONST1; 
float y = CONST2; 

をあなたはしないでくださいコンパイラが自動的にCONST1floatにするので、xの警告が表示されます。 yの場合、CONST2floatには収まらないが、にはコンパイラがfloatにキャストするので、警告が表示されます。


"定義" で、あなたはconst変数を使用することを意味した場合は、ここでは何が起こるかです:

は、あなたが今、あなたが持っている場合

const double CONST1=1.5; 
const double CONST2=1.12312455431461363145134614; // Assume some number too 
                // precise for float 

を持って言う:

float x = CONST1; 
float y = CONST2; 

コンパイラがCONST1CONST2の値を知る方法はありません(*)であるため、コンパイル時に値をfloatと解釈できません。データ消失の可能性について2つの警告が表示され、変換は実行時に行われます。

(*)実際には方法があります。値はconstなので、オプティマイザは変数を取らずにコード全体の値を置き換えることにします。これらの変数にアドレスを渡す可能性があるため、これは複雑になる可能性があります。そのため、オプティマイザはそれを行わないことにします。つまり、それを信じてはいけません。


このすべての基本的なタイプの変換に該当することに注意してください。あなたは

#define CONST3 1 

を持っているなら、あなたはCONST3intあると思いますが、あなたはfloatに入れた場合、それはコンパイル時にfloatなる、またはあなたがcharに入れた場合、それはコンパイラでcharなります-時間。

+0

"あなたは自分自身に注意したように、コンパイラがCONST1とCONST2の値を知る方法はありません。これはまったく間違っています。実際、コンパイラ*は知っており、最適化します。あなたはよく定義された状況でそれを期待することができます。 –

+3

そして 'float'の精度が' 1に十分であることは確かです。2 'は正確に表現されますか? ;) –

+0

私のコードではプリプロセッサマクロを使いたくないのは間違いです。ここでの問題は、g ++やvcのような一般的なコンパイラがこれらの最適化を行うかどうかです。私はインライン関数も考えましたが、私は定数を得るために "呼び出し"という考え方を嫌います。 – Paranaix

関連する問題