标签: floating-accuracy

为什么D + 0.1 + 0.2 == 0.3?

assert(0.1 + 0.2 != 0.3); // shall be true
Run Code Online (Sandbox Code Playgroud)

是我最喜欢的检查,语言使用本机浮点运算.

C++

#include <cstdio>

int main()
{
   printf("%d\n", (0.1 + 0.2 != 0.3));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/ErBMd

蟒蛇

print(0.1 + 0.2 != 0.3)
Run Code Online (Sandbox Code Playgroud)

输出:

True
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/TuKsd

其他例子

为什么D不适用?理解D使用本机浮点数.这是一个错误吗?他们是否使用某些特定的数字代表?别的什么?很混乱.

d

import std.stdio;

void main()
{
   writeln(0.1 + 0.2 != 0.3);
}
Run Code Online (Sandbox Code Playgroud)

输出:

false
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/mX6zF


UPDATE

感谢LukeH.这是在那里描述的浮点常数折叠的效果.

码:

import std.stdio;

void main()
{
   writeln(0.1 + 0.2 != 0.3); // …
Run Code Online (Sandbox Code Playgroud)

floating-point d floating-accuracy constantfolding

75
推荐指数
3
解决办法
2万
查看次数

(.1f + .2f ==.3f)!=(.1f + .2f).Equals(.3f)为什么?

我的问题不是浮动精度.这是为什么Equals()不同于==.

我明白为什么.1f + .2f == .3ffalse(同时.1m + .2m == .3mtrue).
我得到的==是参考,.Equals()是价值比较.(编辑:我知道还有更多.)

但是,为什么(.1f + .2f).Equals(.3f) true,而(.1d+.2d).Equals(.3d)仍然是false

 .1f + .2f == .3f;              // false
(.1f + .2f).Equals(.3f);        // true
(.1d + .2d).Equals(.3d);        // false
Run Code Online (Sandbox Code Playgroud)

c# equality floating-accuracy

67
推荐指数
3
解决办法
5938
查看次数

.NET中的十进制不准确

昨天在调试期间发生了一些奇怪的事情,我无法解释它:

十进制计算

带括号的十进制计算

所以也许我没有在这里看到明显的或者我误解了.NET中的小数,但结果是否应该相同?

.net c# decimal floating-accuracy

58
推荐指数
3
解决办法
3974
查看次数

大量错误地在JavaScript中舍入

看到这段代码:

<html>
  <head> 
    <script src="http://www.json.org/json2.js" type="text/javascript"></script>
    <script type="text/javascript">

      var jsonString = '{"id":714341252076979033,"type":"FUZZY"}';
      var jsonParsed = JSON.parse(jsonString);
      console.log(jsonString, jsonParsed);

    </script>
  </head>
  <body>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我在Firefox 3.5中看到我的控制台时,jsonParsed的值是:

Object id=714341252076979100 type=FUZZY
Run Code Online (Sandbox Code Playgroud)

即数字四舍五入.尝试了不同的值,相同的结果(数字舍入).

我也没有得到它的舍入规则.714341252076979136舍入为714341252076979200,而714341252076979135舍入为714341252076979100.

编辑:请参阅下面的第一条评论.显然这不是关于JSON,而是关于JavaScript数字处理的东西.但问题仍然存在:

为什么会这样?

javascript floating-point floating-accuracy ieee-754

55
推荐指数
4
解决办法
3万
查看次数

JavaScript处理大数字(BigNum)的标准解决方案是什么?

是否有一个用于JavaScript或内置的bignum库,我可以包括

<script type="text/javascript" src="the_bignum_library.js"></script>
Run Code Online (Sandbox Code Playgroud)

我认为我的用户更愿意在网页中输入数字并等待7秒才能获得结果,而不是下载可执行文件并点击一堆"此可执行文件可能会损害您的计算机"警告屏幕进行安装.

我考虑过自己的http://github.com/silentmatt/javascript-bigintegerhttp://www.mainebrook.com/john/fun/euler.html.或者你会建议从JavaScript调用Java bignum库,如apfloat?

javascript floating-accuracy bignum

50
推荐指数
1
解决办法
4万
查看次数

python中的负零

[Python 3.1]

我在python的输出中遇到负零; 它的创建举例如下:

k = 0.0
print(-k)
Run Code Online (Sandbox Code Playgroud)

输出将是-0.0.

但是,当我将-k0.0 比较为相等时,它会产生True.有什么区别0.0-0.0(我不在乎他们可能有不同的内部表示.我只关心自己的程序中的行为)是否有任何隐藏的陷阱我应该知道的?

python floating-point floating-accuracy zero

47
推荐指数
4
解决办法
2万
查看次数

Python浮点任意精度可用吗?

只是为了好玩,因为它非常简单,我编写了一个简短的程序来生成嫁接数,但由于浮点精度问题,它没有找到一些更大的例子.

def isGrafting(a):
  for i in xrange(1, int(ceil(log10(a))) + 2):
    if a == floor((sqrt(a) * 10**(i-1)) % 10**int(ceil(log10(a)))):
      return 1

a = 0
while(1):
  if (isGrafting(a)):
    print "%d %.15f" % (a, sqrt(a))
  a += 1
Run Code Online (Sandbox Code Playgroud)

此代码缺少至少一个已知的嫁接编号.9999999998 => 99999.99998999999999949999999994999999999374999999912... 它乘以后似乎会降低额外的精度10**5.

>>> a = 9999999998
>>> sqrt(a)
99999.99999
>>> a == floor((sqrt(a) * 10**(5)) % 10**int(ceil(log10(a))))
False
>>> floor((sqrt(a) * 10**(5)) % 10**int(ceil(log10(a))))
9999999999.0
>>> print "%.15f" % sqrt(a)
99999.999989999996615
>>> print "%.15f" % (sqrt(a) * 10**5) …
Run Code Online (Sandbox Code Playgroud)

python floating-point floating-accuracy

42
推荐指数
4
解决办法
5万
查看次数

如何在C++中执行整数log2()?

在C++标准库中,我发现只有一个浮点日志方法.现在我使用log来查找二叉树中的索引级别(floor(2log(index))).

代码(C++):

int targetlevel = int(log(index)/log(2));
Run Code Online (Sandbox Code Playgroud)

我担心对于某些边元素(值为2 ^ n的元素),log将返回n-1.999999999999而不是n.0.这种恐惧是否正确?如何修改我的陈述以便始终返回正确的答案?

c++ logarithm floating-accuracy

41
推荐指数
7
解决办法
6万
查看次数

如何让bc处理科学(又称指数)表示法中的数字?

bc 不喜欢用科学记数法表示的数字(又称指数表示法).

$ echo "3.1e1*2" | bc -l
(standard_in) 1: parse error
Run Code Online (Sandbox Code Playgroud)

但是我需要用它来处理用这种表示法表达的一些记录.有没有办法bc了解指数表示法?如果没有,我该怎么做才能将它们翻译成bc可以理解的格式?

bash numeric floating-accuracy bc

38
推荐指数
4
解决办法
4万
查看次数

在进行浮动分割时,在进行双击和后退时是否有任何准确度增益?

两个以下有什么区别?

float f1 = some_number;
float f2 = some_near_zero_number;
float result;

result = f1 / f2;
Run Code Online (Sandbox Code Playgroud)

和:

float f1 = some_number;
float f2 = some_near_zero_number;
float result;

result = (double)f1 / (double)f2;
Run Code Online (Sandbox Code Playgroud)

我对非常小的f2值特别感兴趣,这些值在浮点运算时可能产生+无穷大.是否有任何准确性?

使用这种演员表的一些实用指南也会很好.

c floating-point floating-accuracy ieee-754

34
推荐指数
2
解决办法
1493
查看次数