我是C语言的新手。这是我的问题和代码:
我有一个常数和一个具有相同值的变量,我尝试将它们进行比较以检查它们是否相等。在我看来,由于为它们分配了相同的值,因此它们应该相等,但事实并非如此。
#include <stdio.h>
#define mypi1 3.14
int main()
{
int ans;
float mypi2 = 3.14;
if(mypi1==mypi2)
{
ans=1;
}
else
{
ans=0;
}
printf("%i",ans);
return 0;
}
我的输出为0。这表明它们不相等。这背后的原因是什么?这是一个非常简单的问题,但我在任何地方都找不到。请先帮助并谢谢。
答案 0 :(得分:1)
#define mypi1 3.14
float mypi2 = 3.14;
其中第一个是double
类型,第二个是被强制转换为double
的{{1}}。
表达式float
首先将mypi1==mypi2
back 转换为float
,然后再进行比较(其想法是,如果一种类型的范围较小,精度高于其他精度,因此将其转换为两种类型都相同)。
因此,如果double
语句失败,则很可能在if
往返(a)中丢失了信息。
说实话,除非您使用大量的许多浮点值(并且要考虑存储空间),否则您可能应该只在各处使用double -> float -> double
。如果要做需要double
类型,则将其用于两个值:
float
比较两个#define mypi1 3.14f
float mypi2 = 3.14f;
变量将不涉及任何转换。
(a)例如,参见以下完整程序:
float
在此情况下,#include <stdio.h>
#define x 3.14
int main(void) {
float y = 3.14; // double -> float
double z = y; // -> double
printf("%.50f\n", x);
printf("%.50f\n", z);
}
是x
,double
是z
,经过了上述的往返转换。输出显示可能发生的差异:
double