与 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
我正在使用 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