我无法通过简单的程序重现这一点,但在我的程序中的某处我有类似的东西:
float e = f(...);
if (e > 0.0f) {
...
printf("%f", e)
表明e
为0.000000
,但e > 0.0f
为真...... e > 0
和e > 0.0
也是如此。我错过了什么?
答案 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)
代替调试语句,您将看到其中存在非零值。