首页 > 解决方案 > 将#define 常量与具有相同值的变量进行比较不等于(C 语言)

问题描述

我是 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。这表明它们不相等。这背后的原因是什么?这是一个非常简单的问题,但我在任何地方都找不到。请提前帮助和感谢。

标签: c

解决方案


#define mypi1 3.14
float mypi2 = 3.14;

其中第一个是double类型,第二个是double强制转换为float.

在比较之前,该表达式mypi1==mypi2将首先将float 返回转换为 a double(其想法是,如果一种类型的范围/精度小于另一种类型,则将其转换为两种类型相同)。

因此,如果if语句失败,您可能会在double -> float -> double往返(a)中丢失信息。

老实说,除非您使用大量浮点值(并且存储空间是一个问题),否则您可能应该在double任何地方使用。如果您确实需要float类型,请将其用于两个值:

#define mypi1 3.14f
float mypi2 = 3.14f;

比较两个float变量不会涉及任何转换。


(a)例如,参见以下完整程序:

#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);
}

在此,xis adoublezis adouble经历了上面讨论的往返转换。输出显示了可能发生的差异:

3.14000000000000012434497875801753252744674682617188
3.14000010490417480468750000000000000000000000000000

推荐阅读