ieee754:Javascript与C
据我所知,著名的ieee754:Javascript与C,javascript,c,floating-point,ieee-754,Javascript,C,Floating Point,Ieee 754,据我所知,著名的 (0.1 + 0.2) !== 0.3 明白了,这并不是Javascript的错。这就是IEEE754的工作方式。Python中也有类似的输出,它也遵循IEEE 754规则 那么,为什么这个特定的示例有时会像C语言中预期的那样工作呢。如果我直接比较一下 printf("%d\n", (0.1+0.2) == 0.3); 我得到了(un?)预期的输出0,但如果我将值放入变量或打印出来,我会得到正确的四舍五入答案 IEEE754的C实现是否做了额外的工作?还是我完全错过了别
(0.1 + 0.2) !== 0.3
明白了,这并不是Javascript的错。这就是IEEE754的工作方式。Python中也有类似的输出,它也遵循IEEE 754规则
那么,为什么这个特定的示例有时会像C语言中预期的那样工作呢。如果我直接比较一下
printf("%d\n", (0.1+0.2) == 0.3);
我得到了(un?)预期的输出0
,但如果我将值放入变量或打印出来,我会得到正确的四舍五入答案
IEEE754的C实现是否做了额外的工作?还是我完全错过了别的什么
更新
我发布的代码示例由于输入错误而被破坏。试试这个
但最初的问题仍然存在
double d1, d2, d3;
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
printf ("%.17f\n", d1+d2);
printf ("%d\n", ((d1+d2) == d3));
输出是
1
0.30000000000000004
1
现在重新措辞的问题是:
0.3 == 0.30000000000000004
0.3==0.300000000004您的示例代码使用1、2和(1+2),它们都可以用双精度浮点表示。另一方面,0.1不能精确地用浮点表示,因此可以得到这个数字的近似值。当将大约0.1添加到大约0.2时,您将得到大约0.3,但这是否与编译器在表示0.3时选择的近似值完全相同,谁知道呢 表示法使用二进制。这意味着它使用1/2、1/4、1/8、1/16、1/32(以此类推,精确到一定程度……)。这意味着0.5、0.25等可以精确表示。不是二进制分数的精确和的数字可以非常接近 解决方案:不要相互比较浮点数。将它们的差异与一些你不关心的小数字进行比较
#define EPSILON 0.000001
printf("%d", fabs((0.1+0.2) - 0.3 ) < EPSILON );
#定义ε0.000001
printf(“%d”,fabs((0.1+0.2)-0.3)
我不知道为什么C代码可以工作而python/javascript不能。这是魔法。但希望这能回答您的问题。您的示例代码使用1、2和(1+2),它们都可以用双精度浮点表示。另一方面,0.1不能精确地用浮点表示,因此可以得到这个数字的近似值。当将大约0.1添加到大约0.2时,您将得到大约0.3,但这是否与编译器在表示0.3时选择的近似值完全相同,谁知道呢
`printf("%d\n", (0.1+0.2) == 0.3);`
表示法使用二进制。这意味着它使用1/2、1/4、1/8、1/16、1/32(以此类推,精确到一定程度……)。这意味着0.5、0.25等可以精确表示。不是二进制分数的精确和的数字可以非常接近
解决方案:不要相互比较浮点数。将它们的差异与一些你不关心的小数字进行比较
#define EPSILON 0.000001
printf("%d", fabs((0.1+0.2) - 0.3 ) < EPSILON );
#定义ε0.000001
printf(“%d”,fabs((0.1+0.2)-0.3)
我不知道为什么C代码可以工作而python/javascript不能。这是魔法。但希望这能回答你的问题
`printf("%d\n", (0.1+0.2) == 0.3);`
这些是双打而不是浮球
做:
瞧
看看这个问题。这是关于smth的,但使用GCC的ppl得到的结果与使用MSVC的ppl不同。
这些是双打而不是浮球
做:
瞧
看看这个问题。这是关于smth的,但使用GCC的ppl得到的结果与使用MSVC的ppl不同。
为什么(何时,如何)C编译器会冒昧地这么说
0.3 == 0.30000000000000004
考虑到所有的事实,C实现被破坏了,而不是Java脚本,这难道不是真的吗
事实并非如此
给出的输出来自以下代码:
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
但你写道:
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
因此,d3
不是0.3
,而是0.3000000000004
为什么(何时,如何)C编译器会冒昧地这么说
0.3 == 0.30000000000000004
考虑到所有的事实,C实现被破坏了,而不是Java脚本,这难道不是真的吗
事实并非如此
给出的输出来自以下代码:
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
但你写道:
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
因此,
d3
不是0.3
,而是0.3000000000004
在您的代码示例中,您从未实际打印任何非整数的数字。您的问题与JavaScript没有任何关系。它与C和双打的处理有关,有时你得到一个结果,而有时你得到一个不同的结果。(我的猜测是,有时,预处理器正在进行计算,因此编译器看到的是printf(“%d\n”,0.3==0.3);
,但这只是猜测。)@Manav:即使您也提供了链接,也要在问题本身中包含相关的代码(和输出)。您当前在问题中的代码与您链接到的代码不同,链接可能会损坏。更多:@Alnitak So?这有关系吗?请注意GCC与MSVC“不同程度地被破坏”。看看不同的编译器如何给出不同的结果:在您的代码示例中,您从未实际打印过任何非整数的数字。您的问题实际上与JavaScript无关。它与C和双打的处理有关,有时你得到一个结果,而有时你得到一个不同的结果。(我的猜测是,有时,预处理器正在进行计算,因此编译器看到的是printf(“%d\n”,0.3==0.3);
,但这只是猜测。)@Manav:即使您也提供了链接,也要在问题本身中包含相关的代码(和输出)。您当前在问题中的代码与您链接到的代码不同,链接可能会损坏。更多:@Alnitak So?这有关系吗?请注意GCC与MSVC“不同程度地被破坏”。看看不同的编译器如何给出不同的结果:我想知道这个