提问人:ce.teuf 提问时间:4/23/2021 最后编辑:ce.teuf 更新时间:4/24/2021 访问量:474
R 与 Python 在浮点分辨率上的差异:是否可以将 Python 设置为像 R 一样?
R vs Python differences in floating point resolution : Is it possible to set Python act like R?
问:
我正在从事一个涉及线性代数概念操作的个人项目。 该项目首先涉及将 R(64 位版本)代码复制(翻译)为 Python 代码。 此处描述的问题试图重现我面临的问题。
根据我所做的一些互联网搜索,这个问题似乎与非常精确地处理十进制数有关。
下面是两段代码:
R代码:
library(base)
# load, subsetting and convert df to matrix
df <- read.csv('hansen99.csv')
arr <- data.matrix(df[c(4:20)])
# crossprod leads to a square matrix and do inverse calculation
A <- t(arr) %*% arr # crossprod leads to a square matrix
A_inv <- solve(A)
# affichage avec 100 décimales
sprintf("%.100f",A_inv[1,1])
# '0.0023559636604639148764472889041599046322517096996307373046875000000000000000000000000000000000000000'
Python 代码:
import numpy as np
import numpy.linalg as npla
import pandas as pd
# load, subsetting and convert df to array
df = pd.read_csv('hansen99.csv')
arr = df.iloc[:, 3:21].values
# crossprod leads to a square matrix and do inverse calculation
A = np.transpose(arr) @ arr
A_inv = npla.inv(A)
# affichage avec 100 décimales
"{:.100f}".format(A_inv[0,0])
# '0.0023559636604639157438090268925634518382139503955841064453125000000000000000000000000000000000000000'
因此,A_inv 是给定矩阵 A(csv 文件)的倒数。如果我取这个矩阵的第一个元素并用 100 位小数打印它,我得到:
R : '0.0023559636604639*1*48764472889041599046322517096996307373046875000000000000000000000000000000000000000'
Python : '0.0023559636604639*1*57438090268925634518382139503955841064453125000000000000000000000000000000000000000'
我们可以看到,在小数点后第 17 位(星号之间)之后,R 和 Python 之间显示的数字序列是不同的。
我做了一些研究,这似乎与类型的十进制分辨率有关。
在 python 中,我有 float64 类型的命令(不知道如何在 R 中获取它):
np.finfo(np.float64)
# finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)
注意:
这种差异似乎与两种语言各自功能之间的差异无关。我调用了 Python 中的 R 函数和 R 中的 Python 函数来确保。
数据:
如果您对数据感兴趣,请关注 https://github.com/ceteuf/PSTR/tree/main/data/hansen99.csv
问题:
1)您认为造成这种差异的原因是什么?(需要澄清,并可能提供良好的资源以了解更多信息)
2) 是否有可能通过修改配置或其他方式来重现与 R 完全相同的结果和行为?
2b) 还是我完全错了?在这种情况下,你有线索吗?
答: 暂无答案
评论
。机器
。.Machine$double.xmax
?decimal
"%.100f"