このanswerから理解したように、float.h
を使用して精度をマクロLDBL_MANT_DIG
で拡張する方法があります。私の目標はdouble
の浮動小数点精度を向上させて、より正確な数値を格納できるようにすることです(0.000000
ではなく0.000000000566666
など)。親切にも、このマクロを使用するための短い例を誰かが与えることができますので、バッファに保存されている精度を拡張できますか?浮動小数点精度を向上させるためにfloat.hマクロを使用する方法
答えて
あなたが引用した答えは、マクロが格納できる精度桁数と等しいことだけを示しています。これは決して精度を上げることはできません。しかし、このマクロはダブルスではなく「ロング・ダブル」のためのものです。
long double x = 3.14L;
お知らせ長い二リテラルを特定するための番号の後に「L」:あなたはdouble型よりも精度が必要な場合は、long double型を使用することができます。
浮動小数点型はハードウェアで実装されています。精度は業界全体で標準化され、CPUの回路に焼き付けられます。 GMPのような拡張精度のソフトウェアライブラリを除いて、それをlong double
以上に増やす方法はありません。
良いニュースは、浮動小数点数が先行ゼロで詰まっていないことです。 0.000000000566666はゼロに丸められません。 6桁の数字だけで、それをうまく表現するために単精度float
が必要です。
POSIX標準はπとlong double
精度で電子を提供するために、失敗したmath.h
の問題(ないfloat.h
)が、あります。いくつかの回避策があります。 M_PIl
とM_El
のいずれかのプリプロセッサを使用するか、またはプリプロセッサを使用して別のライブラリ(数字がlong double
)にリテラル定数にl
を貼り付け、余裕を持たせることもできます。
より正確な数値を保存したいので、ちょうど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
に変換されます。したがってはfloat
とdouble
タイプの両方に使用でき、実際にはフォーマット(C99で定義されているものはすべてC90で定義されています)を使用してfloat
またはdouble
の値をフォーマットできます。 %Lf
フォーマットは、long double
を想定しています。
float
またはdouble
に精度を格納する方法は、単に<float.h>
のマクロのいずれかを使用するだけです。これらは、浮動小数点型の特性と、他のものよりも動作する方法の詳細な説明です。
- 1. 浮動小数点精度
- 2. 浮動小数点数の精度を高める
- 3. Objective-C - 浮動小数点数の精度を上げる方法
- 4. 浮動小数点数の精度
- 5. 倍精度浮動小数点数の浮動小数点コードを読む
- 6. 浮動小数点精度形式
- 7. 浮動小数点型の精度printf
- 8. MongoDB浮動小数点値の精度?
- 9. 倍精度浮動小数点型+ Eigen
- 10. 単精度浮動小数点表現から半精度浮動小数点数への変換
- 11. JGoodiesで浮動小数点または倍精度をバインドする方法
- 12. 浮動小数点数の精度を設定する
- 13. 単精度浮動小数点の使用
- 14. 浮動小数点/倍精度/整数値をHBaseでエンコードする方法は?
- 15. AndroidでGroovyで倍精度浮動小数点数を浮動小数点にすると
- 16. 浮動小数点型の浮動小数点数を使用している浮動小数点数は、浮動小数点数の上位16桁です。
- 17. hdf5データセットの浮動小数点精度を設定する
- 18. エリクシール:浮動小数点精度> 15を計算する方法?
- 19. knexスキーマで浮動小数点精度を指定する方法は?
- 20. 浮動小数点配列を倍精度浮動小数点配列に変換してすぐに戻す
- 21. 倍精度浮動小数点数型(Double#)の倍精度浮動小数点型をscalaで比較すると保存されますか?
- 22. 異なるシステムでの浮動小数点数の精度
- 23. 範囲の縮小単精度浮動小数点の精度が悪い
- 24. C++浮動小数点の固定小数点精度を設定する方法
- 25. ElasticSearchファセットの用語クエリの浮動小数点精度
- 26. Bigquery - 浮動小数点型を浮動小数点型にキャストする方法
- 27. 倍精度浮動小数点または破損エラーC++
- 28. Symfony JsonResponse:間違った浮動小数点精度
- 29. 精度が低下した浮動小数点数のリストを比較する
- 30. javascript浮動小数点数の精度浮動小数点数が6桁を超えて
'float'の精度を上げることはできません。ヘッダーは、システムとそのハードウェアによってどのような精度が提供されているかを確認するためのマクロを提供しますが、それだけです。 – dasblinkenlight
''%f "'で印刷すると、小数点以下6桁になります。代わりに '%e'または'%g'を使用するか、精度制御を追加するか、あるいはその両方を行います。 –