C 为什么不满足这个条件?

C 为什么不满足这个条件?,c,lapacke,C,Lapacke,结果: printf("Elements of vector U:\n"); rprint_vector(u, n); double vt = dasum_(&n, u, &incx); printf("vt = %lf\n", vt); if (vt == 0) printf("yes vt = 0\n"); else printf("No vt != 0\n"); 即使变量vt等于0,条件也不满足。问题出在哪里 这是有限精度表示的本质 我将使用固定精度十

结果:

printf("Elements of vector U:\n");
rprint_vector(u, n); 
double vt = dasum_(&n, u, &incx);
printf("vt = %lf\n", vt);

if (vt == 0)
    printf("yes vt = 0\n");
else
    printf("No vt != 0\n");

即使变量vt等于0,条件也不满足。问题出在哪里

这是有限精度表示的本质

我将使用固定精度十进制表示法进行类比。您将1/3表示为
0.333333
,2/3和
0.66666 7
。因此,如果执行
2/3-1/3-1/3
,结果将是
0.000001
。您可能会将其显示为
0.000
,因为显示更多数字没有多大意义。但它并不完全等于零


不要用这种方式比较浮点数,因为答案会从“是”切换到“否”,甚至有一点不精确。如果您想编写一个“非常非常接近”函数,那么就这样做。

可能是浮点错误……最有可能的是您的
double
不完全为零,因此条件失败。查看所有源代码;而且可能重复的
-0
在某些情况下可以提供有用的信息。@chux以前对这个主题发表过评论,也许他可以改进我的评论。不一定是不精确的值,而是精确的
+0
-0
。简单的
整数比较(双a,双b){返回b>a?(b-a)
就可以了
Elements of vector U:
------------
0.000000
0.000000
-0.000000
0.000000
------------
vt = 0.000000
No vt != 0