3

単純なプログラムではこれを再現できませんが、プログラムのどこかに次のようなものがあります。

float e = f(...);
if (e > 0.0f) {
    ...

printf("%f", e)はそれが真実であることを示していますe0.000000e > 0.0f真実です...e > 0そしてそうですe > 0.0。私は何が欠けていますか?

4

4 に答える 4

6

浮動小数点値はゼロより大きく、1e-7未満です。印刷の問題です。科学的記数法printf( "%e"、value);を使用します。または、最短表記の場合は「%g」。

于 2012-11-14T11:51:25.107 に答える
3

値が10進浮動小数点と出力の精度の両方に丸められるため、ゼロであることを示すという事実printf("%f", e)は何の意味もありませんprintf。したがって、0より大きい非常に小さい数値は0として出力される可能性があります。

試してみて、何が起こるか見てprintf("%e", e)みましょう。printf("%.17f", e)

于 2012-11-14T11:51:48.150 に答える
3

問題は、浮動小数点値が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

于 2012-11-14T12:08:00.500 に答える
0

あなたの問題はそれeが実際にはゼロではないということです。小さな値が含まれていますが、%f10進数に変換されて精度が低下するため、非表示になります。代わりにデバッグステートメントとして使用printf("%e",e)すると、そこにゼロ以外の値があることがわかります。

于 2012-11-14T11:54:40.623 に答える