Nar*_*aki 1 c types if-statement literals
我使用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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
因此,可以清楚地看到"x"中的存储值大于0.3,"y"中的存储值小于0.7
为什么会这样?这是float数据类型的属性还是if-else语句以不同的方式解释float?
谢谢.
编辑:好吧,我思索着它,现在我有点困惑.请告诉我对这个问题的理解是否正确.
float x=0.3;
Run Code Online (Sandbox Code Playgroud)
这存储x=0.30000001192092895508
在内存中.显然,这大于0.3
(这是正确的吗?)
现在,double x=0.3
结果x=0.29999999999999998890
和小于0.3(这也是正确的吗?)
主要问题:因此,如果我使用store 0.3
in float x
,则以下语句将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
.
的值x
和y
不完全0.3和0.7,如那些号码不在二进制浮点数表示的.碰巧最接近float
0.3大于最接近double
0.3,最接近float
0.7小于最接近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
Run Code Online (Sandbox Code Playgroud)
这就解释了它为什么会发生......但它并没有解释如何解决问题,无论你的代码实际上是在做什么,当然.如果您可以为更大的问题提供更多背景信息,我们可以提供更多帮助.
归档时间: |
|
查看次数: |
4231 次 |
最近记录: |