Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Java数学运算给出不同的结果_Java_Python_Math_Biginteger - Fatal编程技术网

Python-Java数学运算给出不同的结果

Python-Java数学运算给出不同的结果,java,python,math,biginteger,Java,Python,Math,Biginteger,我正在用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 m

我正在用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 Answers=1035825199478084272498096890217137953445700726699419360034816 Java Answers=103582519947808425754012757830219157483838652186833068257611776

Java得到了正确的结果,但python没有。据我所知,我没有使用浮点数。这里有什么问题。

当你这样做时

int(math.pow(14764352724, 6))
14764352724**6
即使参数是整数,也可以使用浮点方法将一个大数字提升为幂。转换为整数将失去精度原始结果为浮点:1.0358251994780843e+61

当你这样做的时候

int(math.pow(14764352724, 6))
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
如您所见,这些函数并不等价。在第一种情况下调用。当参数为整数时,此函数有机会精确执行整数乘法:

二元功率

实现TOS=TOS1**TOS

当参数不都是整数时,二进制幂产生与math.pow相同的值:

>>> 14764352724**6.0
1.0358251994780843e+61
>>> int(14764352724**6.0)
10358251994780842724998096890217137953445700726699419360034816
注:可能增加混淆的是内置方法,当使用from math import pow时,该方法不同于后者,并被后者覆盖,但在不使用模参数时,它等效于**运算符:

功率x,y[,z]

将x返回到y的幂;如果存在z,则将x返回到比powx,y%z更有效计算的模z的幂y。两个参数形式powx,y相当于使用幂运算符:x**y

当你这样做的时候

int(math.pow(14764352724, 6))
14764352724**6
即使参数是整数,也可以使用浮点方法将一个大数字提升为幂。转换为整数将失去精度原始结果为浮点:1.0358251994780843e+61

当你这样做的时候

int(math.pow(14764352724, 6))
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
如您所见,这些函数并不等价。在第一种情况下调用。当参数为整数时,此函数有机会精确执行整数乘法:

二元功率

实现TOS=TOS1**TOS

当参数不都是整数时,二进制幂产生与math.pow相同的值:

>>> 14764352724**6.0
1.0358251994780843e+61
>>> int(14764352724**6.0)
10358251994780842724998096890217137953445700726699419360034816
注:可能增加混淆的是内置方法,当使用from math import pow时,该方法不同于后者,并被后者覆盖,但在不使用模参数时,它等效于**运算符:

功率x,y[,z]

将x返回到y的幂;如果存在z,则将x返回到比powx,y%z更有效计算的模z的幂y。两个参数形式powx,y相当于使用幂运算符:x**y


python 3.4在使用14764352724**6时回答1035825199478084257540127578302191574838652186833068257611776。在任何语言中,不要将pow用于整数幂,在执行14764352724**6时,Python2.7中的答案相同。还有数学,14764352724,6=14764352724**6好问题,但14764352724**6或数学。pow14764352724,6不会打断它。用第一个得到正确的结果。你确定吗?查看我的回答当我在查看math.pow的文档时,我发现有一个内置的,也叫做pow的,可以给出正确的结果。对于math.pow,最好遵循@Jean Françoisfare在下面的答案,good call.python 3.4在使用14764352724**6时回答10358251994780842575401275783021915748352186833068257611776。在任何语言中,不要将pow用于整数幂,在执行14764352724**6时,Python2.7中的答案相同。还有数学,14764352724,6=14764352724**6好问题,但14764352724**6或数学。pow14764352724,6不会打断它。用第一个得到正确的结果。你确定吗?查看我的回答当我在查看math.pow的文档时,我发现有一个内置的,也叫做pow的,可以给出正确的结果。对于math.pow,最好按照@Jean Françoisfare下面的回答来做。好的,我发现了同样的结果。但我觉得应该有办法解决这个问题。当使用POW时,在Python库的设计中这不是一个深思熟虑的选择吗?e、 g.比较14764352724**6和14764352724**6。0@mad你为什么这么想?pow在内部使用浮点数学,并且有文档记录这样做,这意味着其结果仅限于浮点精度和限制。根本没有办法,我发现了同样的结果。但我觉得应该有办法解决这个问题。当使用POW时,在Python库的设计中这不是一个深思熟虑的选择吗?e、 g.比较14764352724**6和14764352724**6。0@mad你为什么这么想?pow在内部使用浮点数学 d被记录为这样做,这意味着其结果仅限于浮点精度和限制。根本没有办法。