実際の値が与えられた場合、float
データ型が数値を格納するのに十分かどうか、または adouble
が必要かどうかを確認できますか?
精度はアーキテクチャごとに異なることを知っています。正しいデータ型を判断する C/C++ 関数はありますか?
実際の値が与えられた場合、float
データ型が数値を格納するのに十分かどうか、または adouble
が必要かどうかを確認できますか?
精度はアーキテクチャごとに異なることを知っています。正しいデータ型を判断する C/C++ 関数はありますか?
背景については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。
残念ながら、決定を自動化する方法はないと思います。
一般に、人々が文字列ではなく浮動小数点で数値を表す場合、その目的は数値を使用して算術演算を行うことです。すべての入力が許容可能な精度で特定の浮動小数点タイプに適合する場合でも、丸め誤差と中間結果を考慮する必要があります。
実際には、ほとんどの計算は、64ビットタイプを使用して、使用可能な結果を得るのに十分な精度で機能します。多くの計算では、32ビットだけでは使用可能な結果が得られません。
最新のプロセッサでは、バスと算術演算装置は、32ビットと64ビットの浮動小数点で同様のパフォーマンスを提供するのに十分な幅があります。32ビットを使用する主な動機は、非常に大きなアレイを格納するときにスペースを節約することです。
それは次の戦略につながります:
配列がサイズを半分にするために多大な労力を費やすことを正当化するのに十分な大きさである場合は、分析と実験を行って、32ビットタイプが十分な結果をもたらすかどうかを判断し、そうであればそれを使用します。それ以外の場合は、64ビットタイプを使用してください。
精度はプラットフォームにあまり依存しません。プラットフォームは異なっていてもかまいませんが、float
ほぼ普遍的にIEEE 標準の単精度および倍精度double
です。
単精度では、基数 (小数点) の後に 23 ビットの「仮数」または 2 進数が割り当てられます。ドットの前のビットは常に 1 であるため、これは 24 ビットの端数に相当します。log2(10) = 3.3 で割ると、float は7.2 桁の精度になります。
同じプロセスに従うと、double
15.9 桁long double
が生成され、19.2 桁が生成されます (Intel 80 ビット形式を使用するシステムの場合)。
仮数以外のビットは指数に使用されます。指数ビットの数によって、許可される数値の範囲が決まります。シングルは ~ 10 ±38まで、ダブルは ~ 10 ±308まで。
7、16、または 19 桁が必要かどうか、または制限された精度の表現が適切であるかどうかについては、それは実際には質問の範囲外です。アルゴリズムとアプリケーションに依存します。
あなたの質問は、精度を損なうことなくC / C ++(または他のプログラム)に「実数」を指定する方法を前提としていると思います。
この実数をコードまたはユーザー入力で指定して取得するとします。float または double が精度を失うことなく格納するのに十分かどうかを確認する方法は、有効ビット数を数えて、float と double のデータ範囲に対して確認することです。
数値が式 (つまり1/7
またはsqrt(2)
) として指定されている場合は、次の検出方法も必要になります。
さらに、 float / double が理論的に「正確に」表現できない などの数値があります。0.9
少なくとも、バイナリ計算パラダイムではありません) -これに関する Jon Skeet の優れた回答を参照してください。
float
単純にaとdouble
変数に格納して、これら2つを比較することはできませんか?これは暗黙的にバックをダブルに変換する必要float
があります-違いがない場合は、float
それで十分ですか?
float f = value;
double d = value;
if ((double)f == d)
{
// float is sufficient
}
float または double 変数で実数を表すことはできませんが、有理数のサブセットのみを表すことができます。
浮動小数点計算を行う場合、CPU 浮動小数点ユニットが最適な近似値を決定します。
私は間違っているかもしれませんが、float (4 バイト) と double (8 バイト) の浮動小数点表現は実際には comp アーキテクチャとは独立して指定されていると思いました。