首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEEE 754: Javascript

IEEE 754: Javascript
EN

Stack Overflow用户
提问于 2012-07-03 09:42:22
回答 3查看 519关注 0票数 0

据我所知,著名的

代码语言:javascript
复制
 (0.1 + 0.2) !== 0.3

抓到你其实不是Javascript的错。这正是IEEE 754的工作方式。Python中也有类似的输出,它也遵循IEEE 754规则。

那么,为什么这个特定的例子可以像C中所期望的那样工作呢?如果我直接比较

代码语言:javascript
复制
printf("%d\n", (0.1+0.2) == 0.3);

我得到(un?)预期的输出0,但如果将值放入变量或打印出来,则得到正确的四舍五入的答案。

C可运行的示例

IEEE 754的C实现是在做额外的事情吗?或者是我完全错过了什么东西。

更新

我发布的代码示例由于错误而被破坏了。试试这个修正C可运行示例

但最初的问题仍然存在。

代码语言:javascript
复制
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));

输出是

代码语言:javascript
复制
1
0.30000000000000004
1

现在重新措辞的问题是:

  1. 为什么(以及何时,以及如何)C编译器冒昧地说 0.3 == 0.30000000000000004
  2. 考虑到所有的事实,不是C实现被破坏了吗,而不是Javascripts的呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-03 10:04:37

为什么(以及何时,以及如何)C编译器冒昧地说 0.3 == 0.30000000000000004 考虑到所有的事实,不是C实现被破坏了吗,而不是Javascripts的呢?

事实并非如此。

给出的输出来自以下代码:

代码语言:javascript
复制
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));

但你写道:

代码语言:javascript
复制
d1 = 0.1;    d2 = 0.2;    d3 = d1 + d2;

所以d3不是0.3,而是0.30000000000000004

票数 4
EN

Stack Overflow用户

发布于 2012-07-03 09:58:21

代码语言:javascript
复制
`printf("%d\n", (0.1+0.2) == 0.3);`

这是双倍,而不是浮标。

做:

代码语言:javascript
复制
printf("%d\n", (0.1+0.2) == 0.3);
printf("%d\n", (0.1f+0.2f) == 0.3f);

然后瞧!

http://codepad.org/VF9svjxY

代码语言:javascript
复制
Output:
0
1

看看这个问题。另外,使用GCC的ppl得到的结果与MSVC的ppl不同。打印浮点数的整体部分

票数 1
EN

Stack Overflow用户

发布于 2012-07-03 09:53:30

示例代码使用1、2和(1+2),它们都完全可以用双精度浮点表示。另一方面,在浮点中不完全可以表示,因此得到了这个数字的近似。当添加大约0.1到大约0.2时,您将得到大约0.3,但是这是否将是编译器在表示0.3时所选择的完全相同的近似。

表示使用二进制。这意味着它使用了1/2、1/4、1/8、1/16、1/32 (等等)。这意味着0.5,0.25等完全可以被表示。不是二元分数的精确和的数字可以非常接近地近似。

解决方案:不要互相比较浮点数。把他们的差异与一些你不关心的小数字进行比较。

代码语言:javascript
复制
#define EPSILON 0.000001
printf("%d", fabs((0.1+0.2) - 0.3 ) < EPSILON );

我不知道为什么C代码工作,python/javascript不工作,这很神奇。但希望这能回答你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11308272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档