如题,看似很简单的一个计算公式 z = (unsigned int)(pow(x, y)) ,x、y都为unsigned char,使用python实现时,确是暗藏一个坑,中间出现一些莫名其妙的错误,导致数据一直无法计算正确。而对方是一个校验计算中的一个步骤,如果不一致,此时无法正确校验。
起初,我直接使用python基础的pow函数进行计算,如下:
def calc(x, y):
return int(pow(x,y)) & 0xffffffff
但是这样计算,在数据量较大情况下如x=201,y=16的情况下,该函数直接返回的是0,但是python计算出的结果确是:192047745,两者出现不一致情况。
苦思冥想,做了各种实验都无法正确得出结果,最终查看c++的pow的说明,发现该函数返回结果为double,而double类型是有精度限制的,精度最高只有53个bit位,造成了该问题,最终通过使用numpy科学计算,来解决这个问题,代码如下:
import numpy as np
def calc(x, y):
n = np.float_power(np.uint8(x), np.uint8(y))
return np.uint32(n)