c - 将#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。这表明它们不相等。这背后的原因是什么?这是一个非常简单的问题,但我在任何地方都找不到。请提前帮助和感谢。
解决方案
#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);
}
在此,x
is adouble
和z
is adouble
经历了上面讨论的往返转换。输出显示了可能发生的差异:
3.14000000000000012434497875801753252744674682617188
3.14000010490417480468750000000000000000000000000000
推荐阅读
- colors - 如何更改服务器端 tabPanel 标题的颜色?
- scala - 为什么提供部分函数来映射在运行时抛出而不是给出编译错误?
- rsyslog - rsyslog 模板中的 %procid% 有时为空白
- javascript - 如何修复 Node/Cheerio 中的“$(...).click 不是函数”
- python - 通过reg表达式查找txt中的数字,小问题
- python-3.x - 将所有可接受的字符串参数获取到 DataFrameGroupby.aggregate
- javascript - 如何通过 Google 表单审查问题的答案?
- java - Java 8 从可选映射返回
- android - Firebase-core 17.0 依赖项与 Appcompat-v7 冲突
- python - 如何在 Python 中将 pandas.DataFrame.apply 与 getattr 函数一起使用