gpt4 book ai didi

python - 使用 NumPy 进行位破解

转载 作者:行者123 更新时间:2023-11-28 17:36:47 24 4
gpt4 key购买 nike

我正在尝试实现 fast inverse square root 的通用版本我发现 here这是我到目前为止想出的:

import numpy as np

def get_K(exponent, B=127, L=2**23, sigma=0.0450465, f=np.float32):
return f((1 - exponent) * L * (B - f(sigma)))

def get_result(exponent, B=127, L=2**23, sigma=0.0450465, f=np.float32):
K = f(get_K(exponent, 127, 2**23, f(0.0450465)))
return lambda num: (K + f(num*exponent))

if __name__ == '__main__':
print((get_result(0.5)(2)).astype(np.int32))

但是当我运行上面的示例时,我得到了 532487680,这与我在 get_result(0.5) 的 numpy.float32 表示中得到的结果相同(2).

我做错了什么?换句话说,如何使用 numpy 以与在 C 中相同的方式将数字从 32 位 float 处理为 32 位整数?

最佳答案

以下快速反平方根实现可与 numpy 一起使用(改编自 [1] ),

def fast_inv_sqrt(x):
x = x.astype('float32')
x2 = x * 0.5;
y = x.view(dtype='int32')
y = 0x5f3759df - np.right_shift(y, 1)
y = y.view(dtype='float32')
y = y * ( 1.5 - ( x2 * y * y ) )
return y

现在因为 numpy 会分配一些临时数组,这不是很快,

 import numpy as np

x = np.array(1,10000, dtype='float32')

%timeit fast_inv_sqrt(x)
# 10000 loops, best of 3: 36.2 µs per loop

%timeit 1./np.sqrt(x)
# 10000 loops, best of 3: 13.1 µs per loop

如果你需要速度,你应该用 C 来执行这个计算,并使用 Cython、f2py 等编写一个 python 接口(interface)。

关于python - 使用 NumPy 进行位破解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com