相关疑难解决方法(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万
查看次数

除了XHTML自包含标记之外,RegEx匹配开放标记

我需要匹配所有这些开始标记:

<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)

但不是这些:

<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)

我想出了这个,并希望确保我做对了.我只抓住了a-z.

<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)

我相信它说:

  • 找一个小于,然后
  • 然后,查找(并捕获)az一次或多次
  • 然后找到零个或多个空格
  • 找到任何字符零次或多次,贪婪/,然后
  • 找到一个大于

我有这个权利吗?更重要的是,你怎么看?

html regex xhtml

1323
推荐指数
36
解决办法
270万
查看次数

浮点数的Python舍入错误

我不知道这是否是一个明显的错误,但是在运行Python脚本来改变模拟的参数时,我意识到缺少delta = 0.29和delta = 0.58的结果.经过调查,我注意到以下Python代码:

for i_delta in range(0, 101, 1):
  delta = float(i_delta) / 100

  (...)

filename = 'foo' + str(int(delta * 100)) + '.dat'
Run Code Online (Sandbox Code Playgroud)

为delta = 0.28和0.29生成相同的文件,与.57和.58相同,原因是python返回float(29)/ 100为0.28999999999999998.但这不是一个系统性的错误,在某种意义上它并不是每个整数都会发生的.所以我创建了以下Python脚本:

import sys

n = int(sys.argv[1])

for i in range(0, n + 1):
  a = int(100 * (float(i) / 100))
  if i != a: print i, a
Run Code Online (Sandbox Code Playgroud)

而且我看不到发生此舍入错误的数字中的任何模式.为什么这些特定数字会发生?

python

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

基本减法中的Python错误?

可能重复:
Python舍入错误与浮点数
python数学是错误的

我不能让Python正确地做减法1 - 0.8并分配它.它一直提出错误的答案,0.19999999999999996.

我探讨了一下:

sq = {}
sub = {}
for i in range(1000):
    sq[str(i/1000.)+'**2']=((i/1000.)**2)
    sub['1-'+str(i/1000.)]=(1.0-(i/1000.))
Run Code Online (Sandbox Code Playgroud)

并发现这个错误发生在0到1到第三个小数位之间的一个随机的浮点组.当您对这些浮点数进行平方时,也会发生类似的错误,但会出现类似的错误.

我希望对此有一个解释,以及如何使Python正确运算.使用round(x,3)是我现在使用的解决方法,但它并不优雅.

谢谢!

这是我的Python 2.7.3 shell中的一个会话:

*** Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32. ***
*** Remote Python engine  is active ***
>>> 1-0.8
0.19999999999999996
>>> print 1-0.8
0.2
>>> a = 1-0.8
>>> a
0.19999999999999996
>>> print a
0.2
>>> a = 0.2
>>> print a
0.2
>>> a
0.2
>>> …
Run Code Online (Sandbox Code Playgroud)

python arithmetic-expressions subtraction

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

Python舍入错误

我只是使用python作为计算,我看到了这一点

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 62 * 41.2 * 2 / 250
20.435200000000002
>>> 62 * 4.12 * 2 / 25
20.4352
>>>
Run Code Online (Sandbox Code Playgroud)

只是为了确保我通过gcc解雇了以下代码,但这并未向我显示上述行为.我知道这可能是四舍五入的事情,但应该是统一的.为什么python在数学上加起来跟踪00000000002它不应该在那里.

C/C++代码

#include <stdio.h>
int main () {
  printf ("%lf %lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}
Run Code Online (Sandbox Code Playgroud)

结果是

20.435200 20.435200

如果有人对特定数字感到好奇,他们属于一些引擎位移计算比较:)

python python-2.7

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

将十进制数添加到十进制数不能在python中正常工作

我正在尝试将十进制数字添加到十进制数字并且它正常工作,但是当我这样做时,1.1 + 0.1我得到1.2000000000000002但是我希望它等于是1.2.当我这样做的时候,1.0 + 0.1我会得到1.1哪个是完美的,但我不会那样做1.1 + 0.1.那么有什么方法可以摆脱000000000000002来自1.2000000000000002

谢谢.

python numbers decimal

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

在Python中追踪9s

可能重复:
带有浮点数的Python舍入错误

我用numpy创建了一个数组a = numpy.arange(0,1e5,1,dtype=int).a[18645]是预期的18645.当我创建另一个数组时b=a*10e-15,b[18645]是186.4999999999e-12.b[18644]是186.44e-12.为什么Python会创建这些尾随9?

当我试图在数组中搜索元素时出现了这个问题numpy.where.使用尾随的9s,该numpy.where功能未能找到184.45e-12 in b.

python numpy

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

为什么append()会附加不正确的数据?

我不是在寻找我的代码的修复,我想了解什么机制导致我的列表定期填充不正确的数据.

x = []
h = 0.01

for i in range(101):
    x.append(1+i*h)

print x

"""
~$ python ~/dev/python/inf1100/coor1.py 
[1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.1400000000000001, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33, 1.34, 1.35, 1.3599999999999999, 1.37, 1.38, 1.3900000000000001, 1.4, 1.4100000000000001, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.5899999999999999, 1.6, 1.6099999999999999, …
Run Code Online (Sandbox Code Playgroud)

python append

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

为什么.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
查看次数

Python数学精度

我在python中尝试了这个简单的数学运算

>>> math.floor(8.2-0.21)
7.0
>>> math.floor(8.21-0.2)
8.0
>>> math.floor(8.2-0.2)
7.0
Run Code Online (Sandbox Code Playgroud)

第三个应该返回8但是返回7?!

UPDATE

我在PHP,ruby和JAVA中尝试过,我得到了相同的结果.

更新2 我不知道为什么这个问题得到很多投票!

python math floating-point floating-point-precision

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

为什么10 // .01 = 999.0?

为什么不1000?结果是float,因为PEP238中的" 真正分裂语义 " ,但是.这令人困惑.我有这样的假设,实际答案就像999.9999999123564384,但如何检查呢?和BTW.math.float(999.999999999999999) = 100010 / .01 = 1000.0

python python-3.x

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

Python:2.2*3.0 = 6.6000000000000005

我的问题更多是关于为什么在C++,C#和VB中

std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
Run Code Online (Sandbox Code Playgroud)

在Python,Java和Ruby中

2.2*3.0 //prints 6.6000000000000005
Run Code Online (Sandbox Code Playgroud)

我对内存中的浮点表示非常熟悉.我检查过,事实上2.2无法用单精度精确表示在内存中.

但是为什么C++,C#和VB在打印值时会切断结果中不相关的部分而其他部分却没有?

python multiplication floating-point-precision

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