当在计算中使用大量数字时,Python Numba模块给了我一个错误的答案
当我运行此代码时当在计算中使用大量数字时,Python Numba模块给了我一个错误的答案,python,numba,Python,Numba,当我运行此代码时 from numba import jit A,B,C,D = [int(i) for i in input().split()] @jit() def Z (A,B,C,D): X = (A**B)*(C**D) print(X) return X Z(A, B, C, D) 如果我输入值2887966146040760308478041 209676100616,它返回0,这是不对的。问题是,对于数字的整数表示,可以表示的内容有上限和下限 在下面的
from numba import jit
A,B,C,D = [int(i) for i in input().split()]
@jit()
def Z (A,B,C,D):
X = (A**B)*(C**D)
print(X)
return X
Z(A, B, C, D)
如果我输入值2887966146040760308478041 209676100616,它返回0,这是不对的。问题是,对于数字的整数表示,可以表示的内容有上限和下限 在下面的类型签名中,您可以看到,当我输入这些数字时,编译器将A和C分配给32位整数,最大值约为20亿,将B和D分配给64位整数,最大值为1.84*10^19 X也是一个64位整数,但您试图表示的数字太大,无法包含,因此它不会返回准确的结果 您可以查看编译器分配给.inspect\u类型的类型,或者在您的情况下查看Z.inspect\u类型
问题是,对于数字的整数表示,可以表示的内容有上限和下限 在下面的类型签名中,您可以看到,当我输入这些数字时,编译器将A和C分配给32位整数,最大值约为20亿,将B和D分配给64位整数,最大值为1.84*10^19 X也是一个64位整数,但您试图表示的数字太大,无法包含,因此它不会返回准确的结果 您可以查看编译器分配给.inspect\u类型的类型,或者在您的情况下查看Z.inspect\u类型
这是一个巨大的数字。你知道你想要什么答案吗?不知道为什么你会感到惊讶。前半个**B有4万亿位,需要1.6TB的内存来存储。你需要运用常识。这种计算可以用模运算,但不能用整数或浮点运算。这些都是非常大的数字,如果类型应该是int,它将溢出。您可以使用Z.inspect检查类型签名_types@TimRoberts存储起来不需要那么多内存,它只是一个数字表示…@Wade我不知道你的意思。这个数字需要13万亿位。你打算如何在不使用13万亿位的情况下表示它?这是一个巨大的数字。你知道你想要什么答案吗?不知道为什么你会感到惊讶。前半个**B有4万亿位,需要1.6TB的内存来存储。你需要运用常识。这种计算可以用模运算,但不能用整数或浮点运算。这些都是非常大的数字,如果类型应该是int,它将溢出。您可以使用Z.inspect检查类型签名_types@TimRoberts存储起来不需要那么多内存,它只是一个数字表示…@Wade我不知道你的意思。这个数字需要13万亿位。您打算如何在不使用13万亿位的情况下表示它?值得指出的是,在python中,整数可以是任意大的,这就是为什么如果有足够的可用内存,纯python中的结果可能是正确的。值得指出的是,在python中,整数可以是任意大的,这就是为什么如果有足够的可用内存,纯python中的结果可能是正确的。
Z (int32, int64, int32, int64)
--------------------------------------------------------------------------------
# File: C:\Users\wade.roberts\PycharmProjects\workspace\numba_workspace.py
# --- LINE 6 ---
@jit()
# --- LINE 7 ---
def Z(A, B, C, D):
# --- LINE 8 ---
# label 0
# A = arg(0, name=A) :: int32
# B = arg(1, name=B) :: int64
# C = arg(2, name=C) :: int32
# D = arg(3, name=D) :: int64
# $0.3 = A ** B :: int64
# del B
# del A
# $0.6 = C ** D :: int64
# del D
# del C
# X = $0.3 * $0.6 :: int64
# del $0.6
# del $0.3
X = (A ** B) * (C ** D)
# --- LINE 9 ---
# $0.8 = global(print: <built-in function print>) :: Function(<built-in function print>)
# del $0.8
# print(X)
# $0.10 = const(NoneType, None) :: none
# del $0.10
print(X)
# --- LINE 10 ---
# $0.12 = cast(value=X) :: int64
# del X
# return $0.12
return X