Numpy能否精准复现C语言常规运算的官方行为?
用Numpy复现C语言运算行为的可行性问题
背景
我正在用Python设计一款后续将转译为C语言的算法,但Python的数学运算结果可能与C语言不一致。例如C语言中无符号整数运算4294967295 + 1 = 0,但普通Python整数运算并非如此,因此不能使用普通Python整数进行设计。
核心疑问
能否安全便捷地用Numpy复现C语言的运算行为?即对np.uint32或np.float64等类型的数组执行常规运算(+、-、*、/、%、浮点数与整数间的类型转换)时,能否保证(或通过某种方式保证)得到与使用uint32_t和float64_t类型的C程序相同的结果?
我仅关注C语言的官方行为:C语言中允许依赖编译器或处理器的内容,Numpy中也可存在差异,就像不同编译器/处理器之间的差异一样。尤其需要注意的是,Numpy的NaN在C语言中并非总是存在。
补充说明
我重点关注以下运算集合:+、-、*、/、%、浮点数与整数间的类型转换。
自行测试结果
测试1:uint32溢出
C语言中(uint32_t) 4294967295 + (uint32_t) 1 == 0,但Numpy标量无法实现该行为:
>>> import numpy >>> a = numpy.uint32(4294967295) >>> type(a) <class 'numpy.uint32'> >>> a += 1 >>> a 4294967296 >>> type(a) <class 'numpy.int64'>
而Numpy数组可以实现预期的溢出行为:
import numpy a = numpy.array([4294967295], dtype='uint32') a += 1 print(a) print(a.dtype)
输出:
[0] uint32
但这一特定案例无法保证所有数组运算都始终符合C语言的预期。
测试2:负整数除法
C语言中int32类型的-1/2 == 0,但普通Numpy运算结果不符:
two = np.int64(2) mone = np.int64(-1) print(mone / two) print(mone // two)
输出:
-0.5 -1
我想知道是否存在Numpy的设置项,或特定操作数写法,能让Numpy在该案例中得到0的结果。
内容的提问来源于stack exchange,提问作者gdelab
相关产品推荐
相关产品推荐

