Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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
ieee754:Javascript与C_Javascript_C_Floating Point_Ieee 754 - Fatal编程技术网

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
现在重新措辞的问题是:

  • 为什么(何时,如何)C编译器会冒昧地这么说

        0.3 == 0.30000000000000004
    
    0.3==0.300000000004

  • 考虑到所有的事实,C实现被破坏了,而不是Java脚本,这难道不是真的吗


  • 您的示例代码使用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“不同程度地被破坏”。看看不同的编译器如何给出不同的结果:我想知道这个