数学定数を二重値として定義するのは理にかなっていますが、倍精度ではなく浮動小数点値が必要な場合はどうなりますか?コンパイラはコンパイル時にdouble型を浮動小数点として自動的に解釈しますか(つまり、浮動小数点型浮動小数点数として扱われるため)、またはこの変換は実行時に行われますか?コンパイル時にconst double castが使用されていますか?
答えて
"定義" で、あなたは#define
を使用することを意味する場合は、ここでは何が起こるかです:
は、あなたが持っていると言う:あなたが持っている場合
#define CONST1 1.5
#define CONST2 1.12312455431461363145134614 // Assume some number too
// precise for float
は今:
float x = CONST1;
float y = CONST2;
をあなたはしないでくださいコンパイラが自動的にCONST1
をfloat
にするので、x
の警告が表示されます。 y
の場合、CONST2
はfloat
、には収まらないが、にはコンパイラが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;
コンパイラがCONST1
とCONST2
の値を知る方法はありません(*)であるため、コンパイル時に値をfloat
と解釈できません。データ消失の可能性について2つの警告が表示され、変換は実行時に行われます。
(*)実際には方法があります。値はconst
なので、オプティマイザは変数を取らずにコード全体の値を置き換えることにします。これらの変数にアドレスを渡す可能性があるため、これは複雑になる可能性があります。そのため、オプティマイザはそれを行わないことにします。つまり、それを信じてはいけません。
このすべての基本的なタイプの変換に該当することに注意してください。あなたは
#define CONST3 1
を持っているなら、あなたはCONST3
がint
あると思いますが、あなたはfloat
に入れた場合、それはコンパイル時にfloat
なる、またはあなたがchar
に入れた場合、それはコンパイラでchar
なります-時間。
"あなたは自分自身に注意したように、コンパイラがCONST1とCONST2の値を知る方法はありません。これはまったく間違っています。実際、コンパイラ*は知っており、最適化します。あなたはよく定義された状況でそれを期待することができます。 –
そして 'float'の精度が' 1に十分であることは確かです。2 'は正確に表現されますか? ;) –
私のコードではプリプロセッサマクロを使いたくないのは間違いです。ここでの問題は、g ++やvcのような一般的なコンパイラがこれらの最適化を行うかどうかです。私はインライン関数も考えましたが、私は定数を得るために "呼び出し"という考え方を嫌います。 – Paranaix
- 1. コンパイル時に引数が使用されていませんか?
- 2. エラー `const`を` const double`の `const double`引数として渡すと修飾子が破棄されます
- 3. コンパイル時にリテラルが型キャストされていますか?
- 4. コンパイル時にタイプに "bool operator ==(const type&、const type&)"というウェイテストがありますか?
- 5. if文コンパイル時のconst値
- 6. Java(セキュリティ)ポリシーはビルド/コンパイル時に使用されますか?
- 7. constの奇妙な使い方 - これはなぜコンパイルされますか?
- 8. JavaでCast警告がチェックされていませんか?
- 9. コンパイル時に静的const std :: mapを初期化しますか?
- 10. CASEを使用し、次にCASTを使用してCAST値を使用して平均を実行します。
- 11. Doubleが「必要」でないプロパティに対してScala.jsでDoubleが使用されるのはなぜですか?
- 12. std :: arrayクラスメンバはコンパイル時に設定されていますか?
- 13. コンパイル時および実行時に評価されるconst char * constexpr
- 14. const constがrvalue(つまり、メモリに格納されていない)の場合、constはconstへのポインタです。
- 15. コンパイル時にエラー:: :: strcmpが宣言されていません
- 16. CASTを使用して
- 17. std :: vectorを呼び出して使用していますが、std :: vector <double、std :: allocator <double>>が使用されています
- 18. なぜ1/2 == 0がdoubleを使用していますか?
- 19. 保護されたクラスが使用されていないコンパイル時の保護されたエラー[VB.net]
- 20. PHPでconstに格納されているプロパティ名を使用
- 21. React Nativeでなぜconst型が使用されているのですか?const {navigate} = this.props.navigation ;?
- 22. Ubuntu 10.04でコンパイル時にPATH_MAXが宣言されていない
- 23. エラー:function "atomicAdd(double *、double)"はすでに定義されています
- 24. 静的constクラスでは定義されていませんが使用されていません
- 25. $コンパイル時に文字列全体がコンパイルされない
- 26. コンパイル時知られている配列サイズ:グラムを使用してコンパイルを渡さ++が、ICPC
- 27. (SWIG C++からPython)警告301:classキーワードが使用されていますが、C++モードでは使用されていません
- 28. コンパイル時のプロパティがランタイムクライアント側のGWTに渡されますか?
- 29. どちらが良いですか?#define PIまたはconst double PI?優れている
- 30. 次のコードは正常にコンパイルされますが、静的使用時にリンクのエラーが表示される
どのコンパイラ? – SQLMason
分かりやすいコンパイラは、コンパイル時に定数の変換を行います。 –
まあ、私の経験によれば、そこには賢明ではないコンパイラもあります:P実行時の変換を避けるために、適切な型を使用してください。 –