2017-04-22 11 views
-1

このanswerから理解したように、float.hを使用して精度をマクロLDBL_MANT_DIGで拡張する方法があります。私の目標はdoubleの浮動小数点精度を向上させて、より正確な数値を格納できるようにすることです(0.000000ではなく0.000000000566666など)。親切にも、このマクロを使用するための短い例を誰かが与えることができますので、バッファに保存されている精度を拡張できますか?浮動小数点精度を向上させるためにfloat.hマクロを使用する方法

+3

'float'の精度を上げることはできません。ヘッダーは、システムとそのハードウェアによってどのような精度が提供されているかを確認するためのマクロを提供しますが、それだけです。 – dasblinkenlight

+1

''%f "'で印刷すると、小数点以下6桁になります。代わりに '%e'または'%g'を使用するか、精度制御を追加するか、あるいはその両方を行います。 –

答えて

0

あなたが引用した答えは、マクロが格納できる精度桁数と等しいことだけを示しています。これは決して精度を上げることはできません。しかし、このマクロはダブルスではなく「ロング・ダブル」のためのものです。

long double x = 3.14L; 

お知らせ長い二リテラルを特定するための番号の後に「L」:あなたはdouble型よりも精度が必要な場合は、long double型を使用することができます。

0

浮動小数点型はハードウェアで実装されています。精度は業界全体で標準化され、CPUの回路に焼き付けられます。 GMPのような拡張精度のソフトウェアライブラリを除いて、それをlong double以上に増やす方法はありません。

良いニュースは、浮動小数点数が先行ゼロで詰まっていないことです。 0.000000000566666はゼロに丸められません。 6桁の数字だけで、それをうまく表現するために単精度floatが必要です。

POSIX標準はπとlong double精度で電子を提供するために、失敗したmath.hの問題(ないfloat.h)が、あります。いくつかの回避策があります。 M_PIlM_Elのいずれかのプリプロセッサを使用するか、またはプリプロセッサを使用して別のライブラリ(数字がlong double)にリテラル定数にlを貼り付け、余裕を持たせることもできます。

2

より正確な数値を保存したいので、ちょうど0.000000を得られないというあなたのコメントは、問題が記憶域にはなく数値を印刷していることを示唆しています。次のコードを考えてみましょう:実行すると

#include <stdio.h> 

int main(void) 
{ 
    float f = 0.000000000566666F; 
    double d = 0.000000000566666; 
    long double l = 0.000000000566666L; 

    printf("%f %16.16f %13.6e\n", f, f, f); 
    printf("%f %16.16f %13.6e\n", d, d, d); 
    printf("%lf %16.16lf %13.6le\n", d, d, d); 
    printf("%Lf %16.16Lf %13.6Le\n", l, l, l); 
    return 0; 
} 

は、それが生成されます。

0.000000 0.0000000005666660 5.666660e-10 
0.000000 0.0000000005666660 5.666660e-10 
0.000000 0.0000000005666660 5.666660e-10 
0.000000 0.0000000005666660 5.666660e-10 

あなたが見ることができるように、デフォルト"%f"形式のプリントに0.0として値を扱う小数点以下6桁を使用して。しかし、より精度の高い書式が表示されるので、値は正しく格納され、%e形式、または実際には%g形式で、小数点以下の桁数で表示することができます。この例では%e形式と同じにしてください。

%lfまたは%Lfとは対照的に、%fの変換仕様では、「print a double」と記載されています。 floatの値がprintf()に渡されると、intより小さい数値型がintに昇格されるのと同様に、自動的にdoubleに変換されます。したがってはfloatdoubleタイプの両方に使用でき、実際にはフォーマット(C99で定義されているものはすべてC90で定義されています)を使用してfloatまたはdoubleの値をフォーマットできます。 %Lfフォーマットは、long doubleを想定しています。

floatまたはdoubleに精度を格納する方法は、単に<float.h>のマクロのいずれかを使用するだけです。これらは、浮動小数点型の特性と、他のものよりも動作する方法の詳細な説明です。

関連する問題