与 0.9 相比,为什么 >= 运算符在 C 中用作 > 运算符

Why does >= operator work as > operator in C when compared with 0.9

我正在使用 C 并尝试了这个:-

#include<stdio.h>
int main()
{
     float b=0.8,a=0.6;
     if(a&&b>=0.8)
     printf("\nclass")  ;
     else
     printf("\nb");
     return 0;
}

输出如下:-

class

但是当我将 b 的值更改为 0.9 并将 if 中的表达式更改为 a&&b>=0.9 时:-

#include<stdio.h>
int main()
{
     float b=0.9,a=0.6;
     if(a&&b>=0.9)
     printf("\nclass")  ;
     else
     printf("\nb");
     return 0;
}

然后输出是:-

b

谁能解释为什么当 b 的值为 0.9 时 >= 运算符开始充当 > 运算符?

提前致谢。

有些人认为我在浪费他们的时间,所以要补充一点:- 我还尝试将其调试为:-

    #include<stdio.h>
int main()
{
float b=0.9,a=0.6;
printf(" int a   -   %d\n", (int)a);
printf("int b -    %d\n", (int)b);
printf("a&&b  -   %d\n", a&&b);
printf("b>=0.9  -  %d\n", b>=0.9);
if(a&&b>=0.9)
printf("\nclass");
else
printf("\nb");
return 0;   
}

现在 O/p 是 :-

int a   -   0
int b -    0
a&&b  -   1
b>=0.9  -  0

现在请 "Precedence Guy" 告诉我在单个 >= 运算符中将遵循什么优先顺序。

您的代码等同于:

double x1 = 0.9;
float xf = (float)x1; // discard some precision
double x2 = (double)xf;

if (x2 >= x1) {
    // ...
}

问题是,在您将 x1 的某些精度转换为 float 后,它永远无法恢复;将其转换回 double 不会恢复该精度。所以x2还是和0.9不一样,而且由于四舍五入的原因,刚好少了一点。 (注意:如果你用其他值尝试同样的事情,你有时会发现它有点更多。)

0.9无法用二进制精确表示。

而且重要的是 0.9(being double) 首先被隐式转换为 float(less precesion) 然后再转换回 double(higher precession than float) 不保留 excalty 0.9.

因此b的值近似接近0.9不等于0.9。因此,你得到 b

计算机只知道二进制表示。它能够毫无问题地用二进制表示十进制数(并且随着非常大的数字也会发生变化),但是当涉及到小数时,它无法完全表示数字。

在二进制中,每个数字乘以 2 而不是十进制中的 10。

例如看数字 13

1*10^1 + 3*10^0

我们需要用二进制表示相同的数字

1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = (1101)

但事情在小数部分变得复杂。 再举个例子:

13.26 = 13 + 2/10^1 + 6/10^2

但是二进制

(1101) + 0/2^1 + 1/2^2 + 0/2^3 + 0/2^4 + 0/2^5 + 0/2^6 + 1/2^7 + 0/2^8 + 1/2^9 + ... = (1101.010000101....)

我希望这表明用有限的 space 表示小数并不容易。

现在,一旦您将变量声明为浮点数,就会为它们分配有限的 space,而计算机几乎无法接近该小数。在 if 条件下,您没有指定类型,编译器会自动选择 double over float,后者具有更多 space 并且可以更准确地表示小数。在一种情况下,float 表示较大的数字,而在另一种情况下,它表示较小的数字。

要解决这个问题,您可以将文字转换为浮点数

float b = 0.9, a = 0.6;
if (a&&b >= (float)0.9)
    printf("\nclass");
else
    printf("\nb");
cin.get();
return 0;

将输出

\nclass