単純なプログラムではこれを再現できませんが、プログラムのどこかに次のようなものがあります。
float e = f(...);
if (e > 0.0f) {
...
printf("%f", e)
はそれが真実であることを示していますe
が0.000000
、e > 0.0f
真実です...e > 0
そしてそうですe > 0.0
。私は何が欠けていますか?
単純なプログラムではこれを再現できませんが、プログラムのどこかに次のようなものがあります。
float e = f(...);
if (e > 0.0f) {
...
printf("%f", e)
はそれが真実であることを示していますe
が0.000000
、e > 0.0f
真実です...e > 0
そしてそうですe > 0.0
。私は何が欠けていますか?
浮動小数点値はゼロより大きく、1e-7未満です。印刷の問題です。科学的記数法printf( "%e"、value);を使用します。または、最短表記の場合は「%g」。
値が10進浮動小数点と出力の精度の両方に丸められるため、ゼロであることを示すという事実printf("%f", e)
は何の意味もありませんprintf
。したがって、0より大きい非常に小さい数値は0として出力される可能性があります。
試してみて、何が起こるか見てprintf("%e", e)
みましょう。printf("%.17f", e)
問題は、浮動小数点値が0より大きいが、printfが浮動小数点数を。で印刷するために使用する精度よりも小さいこと%f
です。%e
次のプログラムで示すように、またはを使用%g
してより良い結果を得ることができます。
#include <math.h>
#include <stdio.h>
void main(void)
{
int i;
float e;
for (i = 1; i < 64; i++) {
printf("Decimal places: %d\n", i);
e = 1.0 / pow(10, i);
if (e > 0.0f) {
printf("Value displayed with %%e: %e > 0.0f\n", e);
printf("Value displayed with %%f: %f > 0.0f\n", e);
printf("Value displayed with %%g: %g > 0.0f\n\n", e);
}
}
}
これを数学ライブラリでコンパイルする必要があります。 gccの使用:-lm
あなたの問題はそれe
が実際にはゼロではないということです。小さな値が含まれていますが、%f
10進数に変換されて精度が低下するため、非表示になります。代わりにデバッグステートメントとして使用printf("%e",e)
すると、そこにゼロ以外の値があることがわかります。