2016-11-24 13 views
1

本当にこれについて多くを見つけることはできませんでした。 floatの変数をdoubleで初期化すると、コンパイラは不平を言っていないようですが、C++倍精度浮動小数点型の変数を初期化できますか?

double a = 1.0; 
float b = a; 

これはうまくいきますが、これは問題ないと思っていますか、それとも安全ですか?

(I Windowsを実行する32ビットシステムで午前)

+0

@coddding回答で「安全」の定義を想定する必要がありますか? – njuffa

答えて

1

作成された変数のサイズが異なります。 "float = 4バイト"と "double = 8バイト"。したがって、ここで重要なことは、値の範囲が両方のタイプで異なることです。小さい値を1.0として使用する場合は、ワークフローに影響しません。

2

4.8浮動小数点変換

を浮動小数点型のprvalueは、別のフローティングのprvalueに変換することができます。ポイントタイプ。 ソース値を宛先タイプで正確に表すことができる場合、変換の結果は正確に 表現になります。ソース値が2つの隣接する宛先値の間にある場合、変換結果はいずれかの値の実装定義の選択です。それ以外の場合、動作は未定義です。

+0

最後の節(未定義の動作)は、ターゲット・フォーマットの表現可能な範囲外のソース値に適用されます。だから、 "一般的に"未定義の振る舞いが生じるということは間違いです。特定の 'double'から' float'への変換の場合、最初の句は '5.0'のようなソースデータに適用されます。 2番目の節は '3.14159265358979323'のようなソースデータに適用されます。最後の節は '1e308'のようなソースデータに適用されます。 – njuffa

+2

一般的に言えば、** **未定義の動作ではありません。 –

+0

@njuffa質問は、 "_Can I double型の変数_ _を初期化することができますか?"です。 '1'は単なるサンプル値であり、' 1e308'は別のサンプルである可能性があります。私はネイティブスピーカーではありませんが、「一般的な場合、つまりfloatとdoubleの表現についての仮定がなく、具体的な値を前提としない場合はUB_」です。 – AlexD

1

名前が示すように、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桁をしています。

関連する問題