web-dev-qa-db-ja.com

フロートの精度を設定する方法

誰かがC関数で浮動小数点数の精度を選択する方法を説明できますか?

例:

theFatFunction(0.666666666, 3)は0.667を返します

theFatFunction(0.111111111, 3)は0.111を返します

13
Zat42

精度はデータタイプ(つまり、floatまたはdoubleまたは_long double_)によって決定されるため、これを行うことはできません。印刷のために丸めたい場合は、printf()で適切なフォーマット指定子を使用できます。つまり、printf("%0.3f\n", 0.666666666)です。

13
Dan Fego

できません。精度は完全にデータ型に依存します。 floatdoubleがあり、それで終わりです。

2
Joe

フロートには、静的な固定精度があります。変更することはできません。時々できることは、数値を丸めることです。

このページ を参照し、10の累乗でスケーリングすることを検討してください。すべての数値が浮動小数点数として正確に表現できるわけでもないことに注意してください。

2
unwind

ほとんどのシステムは、いくつかの浮動小数点型を定義するIEEE-754浮動小数点標準に準拠しています。

これらのシステムでは、通常、floatはIEEE-754 binary32単精度タイプであり、24ビットの精度を持っています。 doublebinary64倍精度型です。 53ビットの精度があります。ビット数の精度はIEEE-754標準で定義されており、変更できません。

fprintfファミリーの関数(printfなど)を使用して浮動小数点型の値を出力する場合、精度は有効桁の最大数として定義され、デフォルトでは6桁に設定されています。変換仕様の.の後に10進数を続けると、デフォルトの精度を変更できます。例えば:

printf("%.10f\n", 4.0 * atan(1.0));  // prints 3.1415926536

一方

printf("%f\n", 4.0 * atan(1.0));     // prints 3.141593
1
ouah

精度は、データ型(つまり、floatまたはdoubleまたはlong double)によって決定されます。

印刷のために丸めたい場合は、printf()で適切なフォーマット指定子を使用できます。

printf("%0.3f\n", 0.666666666)  //will print 0.667 in c

次に、計算のために丸めたい場合は、最初に浮動小数点を10の桁数で乗算してから、intに型キャストし、計算を実行してから、浮動小数点に型キャストして、同じ10の累乗で除算します。

float f=0.66666; 
f *= 1000;  // 666.660
int i = (int)f; // 666
i = 2*i;  //  1332
f = i;   //  1332
f /= 1000;  // 1.332
printf("%f",f);  //1.332000
0
abe312

おおよそ次の手順になる可能性があります。

  1. 0.605666に0.0005を加算します(0.667166666になります)
  2. 1000を掛ける(667.166666を取得)
  3. 数値を整数にシフトします(667になります)
  4. フロートに戻します(667.0になります)
  5. 1000で割ります(0.667になります)

ありがとうございました。