java - Python - Java 数学运算给出不同的结果
问题描述
我正在用 Java 和 Python 做一些大量的数学运算。总和是一样的,但结果是不同的。
python_n1 = int(math.floor(math.pow(int((int(361) * (int(4900 + 4489))) * int(4356)), int(6))))
BigInteger Java_n1 = (x[20].multiply(x[7].add(x[15])).multiply(x[10])).pow(6);
python_simple_sum = 14764352724**6 #or math.pow(14764352724, 6)
BigInteger Java_simple_sum = new BigInteger("14764352724 ").pow(6)
Python 答案 = 10358251994780842724998096890217137953445700726699419360034816
Java 答案 =10358251994780842575401275783021915748383652186833068257611776
Java 得到了正确的结果,但 python 没有。据我所知,我没有使用浮点数。这里有什么问题。
解决方案
当你这样做
int(math.pow(14764352724, 6))
即使参数是整数,您也会使用浮点方法将一个大数提升为幂。转换为整数会丢失精度(原始结果是浮点数1.0358251994780843e+61
:)
当你这样做
14764352724**6
您使用仅使用整数乘法的二进制幂方法将大数提升为幂。
所以第二个结果是准确的,而第一个不是
>>> int(math.pow(14764352724,6))
10358251994780842724998096890217137953445700726699419360034816 # wrong
>>> 14764352724**6
10358251994780842575401275783021915748383652186833068257611776 # correct
让我们尝试对**
和math.pow
函数进行反汇编:
import dis,math
def test(n):
return n ** 3
def test2(n):
return math.pow(n,3)
dis.dis(test)
dis.dis(test2)
输出
4 0 LOAD_FAST 0 (n)
3 LOAD_CONST 1 (3)
6 BINARY_POWER
7 RETURN_VALUE
7 0 LOAD_GLOBAL 0 (math)
3 LOAD_ATTR 1 (pow)
6 LOAD_FAST 0 (n)
9 LOAD_CONST 1 (3)
12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
15 RETURN_VALUE
如您所见,这些功能是不等价的。BINARY_POWER
在第一种情况下被调用。当参数为 integer 时,此函数有机会准确地执行整数乘法:
BINARY_POWER()
实施 TOS = TOS1 ** TOS
math.pow
当参数不都是整数时,二进制幂产生相同的值:
>>> 14764352724**6.0
1.0358251994780843e+61
>>> int(14764352724**6.0)
10358251994780842724998096890217137953445700726699419360034816
注意:可能增加混乱的是内置pow
方法,它不同于math.pow
(并且在使用时被后者覆盖),但在不使用模参数时from math import pow
等效于运算符:**
pow(x, y[, z])
返回 x 的 y 次幂;如果 z 存在,则返回 x 的 y 次幂,以 z 为模(计算比 pow(x, y) % z 更有效)。两个参数的形式 pow(x, y)等价于使用幂运算符:x**y。
推荐阅读
- java - 如何转换简单日期格式的语言
- android - 如何让我的改造电话出现在 recyclerview 中?
- vue.js - 当 console.log(this.selectedValue) 我得到一个空值
- python - 如何导入 PyInstaller 规范文件中被冻结的包?
- javascript - 如何使用 ag grd react 在子记录下方添加总计
- reactjs - 在 reactjs 中使用 const 发送获取参数
- asp.net-mvc - 如何将信号应用程序与 ASP.NET MVC 集成
- python - 网页抓取时无法使用漂亮的汤和python访问网站网址
- python - KNeighborsClassifier' 对象没有属性 'append'
- linux - 无法连接到网络命名空间中的辅助功能总线