当比较两个是否在Python中浮动时,我看到代码总是这样比较一个小值epsilon,想知道选择正确的epsilon值的最佳实践是什么?它背后的场景是什么?谢谢.
epsilon = 0.000001
abs(a - b)<epsilon
Run Code Online (Sandbox Code Playgroud) 我正在使用 Catch v2.13.1
比较浮点值的正确方法是什么?我以为下面的会失败,但都通过了。
REQUIRE(1147332687.7189338 == Approx(1147332688.4281545).margin(0.0001));
REQUIRE(1147332687.7189338 == Approx(1147332688.4281545));
Run Code Online (Sandbox Code Playgroud)
然而这按预期失败了
REQUIRE(abs(1147332687.7189338 - 1147332688.4281545) <= Approx(0).margin(0.0001));
Run Code Online (Sandbox Code Playgroud)
我不明白为什么前两个语句不起作用
这个问题与我之前发布的问题非常相似,只有一处更改。我不仅想计算所有列的绝对差异,还想找到“Z”列的幅度差异,因此如果当前 Z 比前一个大 1.1 倍,则保留它。
(问题的更多背景)
df = pd.DataFrame({
'rank': [1, 1, 2, 2, 3, 3],
'x': [0, 3, 0, 3, 4, 2],
'y': [0, 4, 0, 4, 5, 5],
'z': [1, 3, 1.2, 3.25, 3, 6],
})
print(df)
# rank x y z
# 0 1 0 0 1.00
# 1 1 3 4 3.00
# 2 2 0 0 1.20
# 3 2 3 4 3.25
# 4 3 4 5 3.00
# 5 3 2 …Run Code Online (Sandbox Code Playgroud) >>> sum([0.3, 0.1, 0.2])
0.6000000000000001
>>> sum([0.3, 0.1, 0.2]) == 0.6
False
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能使结果恰好为 0.6?我不想将结果四舍五入到一定数量的十进制数字,因为那样我可能会失去其他列表实例的精度。
过去几天我一直在使用 python 来做作业。我注意到一件奇怪的事情——
当我使用带有 4 个字节浮点数的 struct.pack() 将此数字放入文件中并使用 struct.unpack() 读回它时,它给出的数字不完全相同,但给出了一些更长的字符串,如果按照浮点存储,我期望该数字
前任。- 字符串 - 0.931973
浮点数 - 0.931973
来自文件 - 0.931972980499(在结构打包并解包为 4 个字节之后)
所以当我从字符串读取它时,我无法理解Python实际上是如何存储我的号码的。
编辑 编写浮点数(我认为在ubuntu上的python 2.7中它是另一种方式,d-double和f-float)
buf = struct.pack("f", float(self.dataArray[i]))
fout.write(buf)
Run Code Online (Sandbox Code Playgroud)
询问 -
buf = struct.pack("f", dataPoint)
dataPoint = struct.unpack("f", buf)[0]
node = root
while(node.isBPlusNodeLeaf()) == False:
node = node.findNextNode(dataPoint)
Run Code Online (Sandbox Code Playgroud)
查找下一个节点 -
def findNextNode(self, num):
i = 0
for d in self.dataArray:
if float(num) > float(d):
i = i + 1
continue
else:
break
ptr = self.pointerArray[i] …Run Code Online (Sandbox Code Playgroud) 我正在使用python2数学模块来计算fsum的总和.据我所知,0.1通常不能存储二进制.据我所知math.fsum应该以某种方式解决这个问题.
import math
math.fsum([0.0, 0.1])
#0.1
math.fsum([0.1, 0.1])
#0.2
math.fsum([0.2, 0.1])
#0.30000000000000004
math.fsum([0.3, 0.1])
#0.4
math.fsum([0.4, 0.1])
#0.5
Run Code Online (Sandbox Code Playgroud)
所以math.fsum([0.2,0.1])== 0.3将为False.这应该是这样的吗?难道我做错了什么?
我怎样才能得到0.2 + 0.1 == 0.3为真?
我有一个系列,如下所示:
example = pd.Series([[1.0, 1209.75, 1207.25],
[1.0, 1211.0, 1207.5],
[-1.0, 1211.25, 1205.75],
[0, 1207.25, 1206.0],
[1.0, 1206.25, 1201.0],
[-1.0, 1205.75, 1202.75],
[0, 1205.5, 1203.75]])
Run Code Online (Sandbox Code Playgroud)
这个系列基本上在每个单元格中有一个包含 3 个数字的列表。我把它变成一个 DataFrame 并添加一个新列:
example = example.to_frame(name="input")
example["result"]=np.NaN
Run Code Online (Sandbox Code Playgroud)
现在我想对其执行以下操作:
example["result"] = example["input"].apply(lambda x,y,z: y if x==1 else z if x==-1 else NaN)
Run Code Online (Sandbox Code Playgroud)
尝试执行此操作时收到以下错误消息:
missing 2 required positional arguments: 'y' and 'z'
这对我来说是一个有点奇怪的问题,我不确定如何正确地命名这个问题。我有以下 MWE,它只是生成坐标点列表(x,t)并执行一些检查以查看它们是否位于用户指定的边界上。特别是, ifx[i] == 1.0和t[i] != 0.0then 程序应该打印一条声明来说明这一点。我似乎无法弄清楚为什么if这里从未输入条件。我已经打印出值对x[i]并t[i]验证是否确实存在满足条件的值对......
#Load Modules
import numpy as np
import math, random
from pylab import meshgrid
# Create the arrays x and t on an evenly spaced cartesian grid
N = 10
xa = -1.0;
xb = 1.0;
ta = 0.0;
tb = 0.4;
xin = np.arange(xa, xb+0.00001, (xb-xa)/N).reshape((N+1,1))
tin = np.arange(ta, tb+0.00001, (tb-ta)/N).reshape((N+1,1))
X_tmp,T_tmp = meshgrid(xin,tin)
x = np.reshape(X_tmp,((N+1)**2,1))
t = np.reshape(T_tmp,((N+1)**2,1)) …Run Code Online (Sandbox Code Playgroud) 我试图确定与零相比时python浮点数的精确程度.请注意以下事项:
1e-323 == 0
> False
1e-324 == 0
> True
Run Code Online (Sandbox Code Playgroud)
我出现的阈值是324小数点,至少与我正在运行的实现(python 2.7,CPython).这记录在哪里?它是依赖于实现的吗?
我有一个看起来像这样的数据集,其中第三列是通过将第一列除以第二列得出的:
A_CLOSE_PRICE B_CLOSE_PRICE A_CLOSE_PRICE/B_CLOSE_PRICE
0 113.55 0.00 inf
1 97.85 80.00 1.223125
2 60.00 70.00 0.857143
3 51.65 51.65 1.000000
4 53.50 NaN NaN
5 NaN 1649.60 NaN
6 40.00 40.50 0.987654
7 1.10 1.00 1.100000
Run Code Online (Sandbox Code Playgroud)
由于我想显示包含超过 10% 差异的行,我运行以下命令:
(df['A_CLOSE_PRICE/B_CLOSE_PRICE'] - 1 ).abs() > 0.1
Run Code Online (Sandbox Code Playgroud)
但是如下所示的最后一行返回“True”而不是“False”,这在我看来就像一个浮点问题。有谁知道应该如何正确处理此问题,以便我可以获得正确的结果?
0 True
1 True
2 True
3 False
4 False
5 False
6 False
7 True
Run Code Online (Sandbox Code Playgroud)