本当にこれについて多くを見つけることはできませんでした。 float
の変数をdouble
で初期化すると、コンパイラは不平を言っていないようですが、C++倍精度浮動小数点型の変数を初期化できますか?
double a = 1.0;
float b = a;
これはうまくいきますが、これは問題ないと思っていますか、それとも安全ですか?
(I Windowsを実行する32ビットシステムで午前)
本当にこれについて多くを見つけることはできませんでした。 float
の変数をdouble
で初期化すると、コンパイラは不平を言っていないようですが、C++倍精度浮動小数点型の変数を初期化できますか?
double a = 1.0;
float b = a;
これはうまくいきますが、これは問題ないと思っていますか、それとも安全ですか?
(I Windowsを実行する32ビットシステムで午前)
作成された変数のサイズが異なります。 "float = 4バイト"と "double = 8バイト"。したがって、ここで重要なことは、値の範囲が両方のタイプで異なることです。小さい値を1.0として使用する場合は、ワークフローに影響しません。
4.8浮動小数点変換
を浮動小数点型のprvalueは、別のフローティングのprvalueに変換することができます。ポイントタイプ。 ソース値を宛先タイプで正確に表すことができる場合、変換の結果は正確に 表現になります。ソース値が2つの隣接する宛先値の間にある場合、変換結果はいずれかの値の実装定義の選択です。それ以外の場合、動作は未定義です。
最後の節(未定義の動作)は、ターゲット・フォーマットの表現可能な範囲外のソース値に適用されます。だから、 "一般的に"未定義の振る舞いが生じるということは間違いです。特定の 'double'から' float'への変換の場合、最初の句は '5.0'のようなソースデータに適用されます。 2番目の節は '3.14159265358979323'のようなソースデータに適用されます。最後の節は '1e308'のようなソースデータに適用されます。 – njuffa
一般的に言えば、** **未定義の動作ではありません。 –
@njuffa質問は、 "_Can I double型の変数_ _を初期化することができますか?"です。 '1'は単なるサンプル値であり、' 1e308'は別のサンプルである可能性があります。私はネイティブスピーカーではありませんが、「一般的な場合、つまりfloatとdoubleの表現についての仮定がなく、具体的な値を前提としない場合はUB_」です。 – AlexD
名前が示すように、doubleはfloat [1]の精度の2倍です。
double has 52 mantissa bits + 1 hidden bit: log(253)÷log(10) = 15.95 digits
float has 23 mantissa bits + 1 hidden bit: log(224)÷log(10) = 7.22 digits
たぶん、あなたはつもりそれをやって精度を失う:一般的には二重のは、ここでの桁数を計算する方法ですフロートは7
を持っていながら、精度の15桁をしています。
@coddding回答で「安全」の定義を想定する必要がありますか? – njuffa