浮点值0大于0

时间:2012-11-14 11:48:34

标签: c floating-point

我无法通过简单的程序重现这一点,但在我的程序中的某处我有类似的东西:

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

printf("%f", e)表明e0.000000,但e > 0.0f为真...... e > 0e > 0.0也是如此。我错过了什么?

4 个答案:

答案 0 :(得分:6)

浮点值大于零,但小于1e-7。这是印刷问题。使用科学记数法printf(“%e”,值);或“%g”表示最短的符号。

答案 1 :(得分:3)

printf("%f", e)显示为零的事实并不意味着什么,因为printf将值舍入到十进制浮点和输出的精度,所以非常小的数字大于0很可能被推出为0。

尝试printf("%e", e)printf("%.17f", e),看看会发生什么。

答案 2 :(得分:2)

问题是浮点值大于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

答案 3 :(得分:0)

您的问题是e实际上不是零。它有一些微小的值,但是它会被隐藏,因为%f会转换为十进制,从而失去精度。使用printf("%e",e)代替调试语句,您将看到其中存在非零值。