相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

为什么十进制数不能用二进制表示?

关于浮点表示,已经向SO发布了几个问题.例如,十进制数0.1没有精确的二进制表示,因此使用==运算符将其与另一个浮点数进行比较是危险的.我理解浮点表示的原理.

我不明白的是,从数学的角度来看,为什么小数点右边的数字比左边的数字更"特殊"?

例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分始终是精确的.但数字6.10并不准确.我所做的只是将十进制移动到一个地方,然后我突然从Exactopia转到了Inexactville.在数学上,两个数字之间应该没有内在差异 - 它们只是数字.

相比之下,如果我将小数位移到另一个方向以产生数字610,我仍然在Exactopia中.我可以继续向那个方向前进(6100,610000000,610000000000000),它们仍然是精确,准确,准确的.但是一旦小数越过某个阈值,数字就不再精确了.

这是怎么回事?

编辑:为了澄清,我想远离关于行业标准表示的讨论,例如IEEE,并坚持我认为是数学上"纯粹"的方式.在基数10中,位置值为:

... 1000  100   10    1   1/10  1/100 ...
Run Code Online (Sandbox Code Playgroud)

在二进制文件中,它们将是:

... 8    4    2    1    1/2  1/4  1/8 ...
Run Code Online (Sandbox Code Playgroud)

对这些数字也没有任何限制.位置无限增加到左侧和右侧.

math floating-point

275
推荐指数
8
解决办法
9万
查看次数

Python - 舍入到最接近的05

我可以蟒蛇做以下四舍五入:

舍入到最接近的05十进制数

7,97 - > 7,95

6,72 - > 6,70

31,06 - > 31,05

36,04 - > 36,05

5,25 - > 5,25

希望它有意义.

python rounding

13
推荐指数
2
解决办法
1万
查看次数

Python舍入问题

>>> num = 4.123456
>>> round(num, 3) # expecting 4.123
4.1230000000000002
Run Code Online (Sandbox Code Playgroud)

结果我期待4.123,我错了吗?

python math floating-point

1
推荐指数
2
解决办法
5826
查看次数

测试两个线段的交叉时算术精度问题

我为平面中两个线段的交叉编写了一个代码测试.我不会打扰你的所有细节.

代码采用两个线段,每个线段由两个端点描述,然后通过拟合a和bin 将每个线段拟合到一条线y = a*x + b.然后它找到两条线的交点x = (b2 - b1) / (a2 - a1).最后,它测试交叉点x是否包含在两个线段中.

相关部分如下所示:

# line parameterization by a = Delta y / Delta x, b = y - a*x
a1 = (line1.edge2.y - line1.edge1.y) / (line1.edge2.x - line1.edge1.x)
b1 = line1.edge1.y - a1 * line1.edge1.x
a2 = (line2.edge2.y - line2.edge1.y) / (line2.edge2.x - line2.edge1.x)
b2 = line2.edge1.y - a2 * line2.edge1.x
# The intersection's x
x = …
Run Code Online (Sandbox Code Playgroud)

python floating-point precision

1
推荐指数
1
解决办法
55
查看次数

为什么.05 + .01 == .06在python 2.7.3中返回False?

按照我的预期.05 + .01应该等于.06但是在python中它不会发生.因为.05+.01 = 0.060000000000000005而且不等于.06.

>>> .01+.01
0.02
>>> .02+.01
0.03
>>> .03+.01
0.04
>>> .04+.01
0.05
>>> .05+.01
0.060000000000000005  #expected .06
>>> .06+.01
0.06999999999999999  #expected .07
>>> .07+.01
0.08
>>> .08+.01
0.09
>>> .09+.01
0.09999999999999999 #expected .10
>>> 0.09999999999999999+.01
0.10999999999999999  #expected .11
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

python python-2.7

-1
推荐指数
1
解决办法
192
查看次数