将实际浮点值与C中的浮点变量进行比较

时间:2014-07-02 15:36:18

标签: c

那么,我有这两个问题吗?

#include <stdio.h>
int main(void) 
{
    float a = 0.7;
    if (0.7 > a)
       printf("Hi\n");
    else
       printf("Hello\n");

return 0;
}

这会是什么输出?根据我的说法,它应该是&#34;你好&#34;。

其次,我有,

#include <stdio.h>
int main(void)
{
    int a=500,b=100,c;
    if (!a >= 400)
       b=300;
    c=200;
    printf("%d %d\n",b,c);
    return 0;
}

据我所知,输出应该是,

100 200

因为!一种手段,而不是一种手段,这意味着,一个非500的值与400相比,它可以大于或小于400,那为什么它会是300?

3 个答案:

答案 0 :(得分:5)

您没有将浮点变量与浮点值进行比较。你认为你会这样做,但你不是。您正在将float变量与double literal进行比较。

0.7 in C是精确的数学数字0.7,四舍五入到最接近的双精度浮点数。

初始化float a = 0.7时,该双精度浮点数舍入为单精度,结果存储在a中。舍入很可能会改变该值,因此变量a的内容稍微多一点或略小于0.7。

然后你比较变量0.7。一个是四舍五入到单精度,另一个是四舍五入到双精度,所以两者都不同。

作为一项规则,你永远不应该使用浮动而不是双倍,除非你有充分的理由这样做,你可以在被问及时证明这一点。

另一方面,你有多大可能与这里的多个其他海报提出完全相同的问题(完全相同的数字,0.7而不是0.8或0.9或3.14或类似的东西),所以我想你试图让我们在这里做你的功课吧?

答案 1 :(得分:3)

对于第一个示例(浮点值),请注意Float的性质将导致它在数字的末尾包含一些垃圾,大约在第15个有效数字左右。长话短说,一个声明为0.7的浮点数永远不会完全等于0.7的字面值。

还有一个关于Stack Overflow的上一个问题,该问题链接到许多优秀资源,进一步解释:How is floating point stored? When does it matter?

在您的第二个示例中,您正在使用&#39; Not&#39;操作员以一种会产生意外结果的方式。 &#39;不&#39;是一个布尔运算符 - 它变为“假”&#39;将价值转化为真实的&#39;价值和真实的&#39;把价值变成“假”&#39;值。

回想一下,在大多数编程语言中,False被赋值为0,这意味着任何非0值都被视为&#39; True&#39;。

所以你的程序实际上在做的是评估!500,然后比较!500到值400. 500不是0,所以它被视为&#39; True&#39;值为布尔运算符&#39; Not&#39;。 Not True = False,False = 0,所以!500 == 0.(试一试:直接打印!500,看看你得到了什么!)。然后,因为0不等于或大于400,所以你的评估是否在&#39;声明也是假的。

答案 2 :(得分:0)

说明代码1:

如果(0.7 > a)此处a是一个浮点变量,0.7是一个双精度常量。双常量0.7大于浮点变量a。因此满足if条件并打印'Hi'
示例:

#include<stdio.h>
int main()
{
    float a=0.7;
    printf("%.10f %.10f\n",0.7, a);
    return 0;
}


输出:

0.7000000000 0.6999999881

请考虑以下代码:

int main(void)
{
    int a = 300, b,c;
    if (a>=400)
      b=300;
    c=200;
    printf("%d %d %d\n",a,b,c);
 }

<强>解释

第1步: int a = 300, b, c;此处变量a已初始化为'300',变量bc已声明,但未初始化。

第2步: if(a >= 400)表示if(300 >= 400)。因此这种情况将会失败。

第3步: c = 200;此处变量c已初始化为'200'

第4步: printf("%d, %d, %d\n", a, b, c);它会打印"300, garbage value, 200"。因为变量b未初始化。