gpt4 book ai didi

c - If-else block 和 float 数据类型的意外结果。 [编辑了一个问题]

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:51 25 4
gpt4 key购买 nike

我用 gcc 4.4.1 编译了下面的程序,我得到了意外的输出(好吧,对我来说是意外的)

#include<stdio.h>

int main()
{
float x=0.3, y=0.7;

if(x==0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}


Output: NONE

#include<stdio.h>

int main()
{
float x=0.3, y=0.7;

if(x<0.3)
{
if(y==0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}

Output: NONE

#include<stdio.h>

int main()
{
float x=0.3, y=0.7;

if(x>0.3)
{
if(y>0.7)
printf("Y\n\n");
else
printf("X\n\n");
}
else
printf("NONE\n\n");
}

Output:X

所以,很明显,x的值大于0.3,y的值小于0.7

为什么会这样?这是 float 数据类型的属性还是 if-else 语句以不同的方式解释 float?

谢谢。


编辑:好吧,我仔细考虑了一下,现在有点糊涂了。请告诉我我对这个问题的理解是否正确。

float x=0.3;

这会将 x=0.30000001192092895508 存储在内存中。显然,这大于 0.3(这是正确的吗?)

现在,double x=0.3 结果是 x=0.29999999999999998890 并且它小于 0.3(这也正确吗?)

主要问题:因此,如果我在 float x 中使用 store 0.3,则以下语句 if(x>0.3) 会导致 x=0.30000001192092895508 被隐式转换为 double 而 0.3 也是 double 而不是 float。因此 0.3=0.29999999999999998890 并且内部操作是 if((double) 0.30000001192092895508 > (double) 0.29999999999999998890)。这是正确的吗?

最佳答案

您正在使用 float 进行存储,但是您正在对类型为 double 的文字进行比较。

xy 的值不完全是 0.3 和 0.7,因为这些数字不能用二进制 float 表示。碰巧最接近 0.3 的 float 大于最接近 0.3 的 double,而最接近 0.7 的 float 小于最接近的 double 到 0.7... 因此您的比较结果。

假设表示与 C# 中的相同(我碰巧有一些工具可以提供帮助),所涉及的值是:

0.3 as float = 0.300000011920928955078125
0.3 as double = 0.299999999999999988897769753748434595763683319091796875
0.7 as float = 0.699999988079071044921875
0.7 as double = 0.6999999999999999555910790149937383830547332763671875

这就解释了为什么会发生这种情况……当然,它并没有解释如何解决您的代码实际尝试执行的问题。如果您能为更大的问题提供更多背景信息,我们或许能够提供更多帮助。

关于c - If-else block 和 float 数据类型的意外结果。 [编辑了一个问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com