R 与 Python 在浮点分辨率方面的差异:是否可以将 Python 设置为像 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) 还是我完全错了?在这种情况下,您有任何潜在客户吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)