Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么控件进入“;其他”;部分_C - Fatal编程技术网

为什么控件进入“;其他”;部分

为什么控件进入“;其他”;部分,c,C,可能重复: 虽然a等于0.8,但它输出y。您使用的是文本,0.8,但这并不一定意味着它是浮点。尝试使用: if (a==0.8F) 反而 此外,由于计算机内部使用base-2,表示数字的小数部分是出了名的容易出错。这是因为浮点不能精确地表示小数,所以它不能精确地表示0.8。您将0.8四舍五入作为浮点与0.8四舍五入作为小数进行比较,两者不一定相同 if (a==0.8f) 试试这个。默认情况下,该类型被认为是双倍的,具有比较精度误差。在二进制浮点中不能准确地表示< P> 0.8。如果(a

可能重复:


虽然a等于0.8,但它输出y。

您使用的是文本,0.8,但这并不一定意味着它是浮点。尝试使用:

if (a==0.8F)
反而


此外,由于计算机内部使用base-2,表示数字的小数部分是出了名的容易出错。

这是因为浮点不能精确地表示小数,所以它不能精确地表示0.8。您将0.8四舍五入作为浮点与0.8四舍五入作为小数进行比较,两者不一定相同

if (a==0.8f)

试试这个。默认情况下,该类型被认为是双倍的,具有比较精度误差。在二进制浮点中不能准确地表示

< P> 0.8。如果(a==0.8)基本上比较单精度0.8和双精度0.8,这两种精度是不相等的,那么您的代码
if(a==0.8)
基本上是比较单精度0.8和双精度0.8

要亲自查看,请尝试以下代码:

int main()
{
    double a = 0.8f;
    double b = 0.8;

    printf("%lX\n", *(long *)&a);
    printf("%lX\n", *(long *)&b);
}
它输出:

3FE99999A0000000
3FE999999999999A

浮点数不是精确的值。您不应该使用==和!=来比较它们。使用带有一些合理小ε的大于和小于运算符:

if ((a > 0.79) && (a < 0.81))
if((a>0.79)和&(a<0.81))

浮动并非总是100%准确,因为它们的存储方式不可能是100%。如果你说
float a=0.8
,a实际上可能是
0.8000000001
或类似的东西。为了补偿这一点,您应该使用某种阈值。请尝试
if(fabs(a-0.8)<1.0e-5)
而不是因为对于浮点数来说,0.8实际上并不意味着0.8,但它是0.79999999,所以会发生这种情况 为什么是0.7999999
这取决于浮点值的存储。十进制值将以二进制形式存储(..,2^3,2^2,2^1,2^0,,,2^-1,2^-2,2^-3,…)

因此,当0.8以2的倍数存储为.101b(不是0.8而是0.79999988)时,其值将小于0.8

if (a > 0.8) 
也是
False
这就是为什么

为了你的结果,试试看

if (a == 0.8f) 

您正在比较两种不同类型的值:
a
类型为
float
0.8
类型为
double

在比较之前,
float
值被转换为
double
。。。但是从
double
转换为
float
并返回并不一定产生相同的值

if (0.8 == (double)(float)0.8) /* ... */

当我在主页上看到这个问题的标题时,我确信这是另一个浮点比较问题。你尝试过搜索吗?我看到了很多重复的问题。互联网上也有许多博客/期刊。你为什么不调查一下?这就是你上一个问题背后的诀窍:当你第一次问这个问题时,你甚至不能正确地复制你的作业?现在你仍然没有提供任何自己的努力,我们应该回答这个以前被问过很多次的问题?@user1202136:你在什么平台上运行了这个测试?@MichaelBurr:我在英特尔处理器上的Ubuntu 12.04/64位上运行了它。为什么?你没有得到相同的值吗?@user1202136:甚至不接近-正如H2CO3所提到的,发布的代码有UB,amd64并不像在32位x86上那样简单地在堆栈上传递varargs(至少对于浮点args,我不记得所有的细节),所以你得到的打印数据实际上与你传递的浮点值无关。
0.8
的实际IEEE十六进制表示是:
3F4CCCCCD
(32位浮点)、
3FE999900000
(32位浮点转换为64位双精度)和
3FE9999999A
(双精度)。@MichaelBurr:你说得对。我修正了上面的代码。非常感谢您的关注。
if (0.8 == (double)(float)0.8) /* ... */