numpy 是否完全重现了 C 的常规操作行为?

1 投票
1 回答
104 浏览
提问于 2025-04-13 20:55

我正在用Python设计一个算法,之后我知道我会想把它转到C语言上。

不过,Python中的数学运算可能和C语言的结果不一样。比如在C语言中,对于无符号整数,4294967295 + 1 = 0,但在普通的Python整数运算中并不是这样。因此,我在设计时不应该使用Python的整数。

我能不能安全且简单地使用Numpy来模拟C语言的行为?也就是说,如果我对类型为np.uint32np.float64的数组进行常规运算(比如加、减、乘、除、取余,或者从浮点数转为整数,反之亦然),我能保证(或者能以某种方式得到这个保证)得到和C程序中使用uint32_tfloat64_t相同的结果吗?

我只关心C语言的“官方行为”,任何依赖于编译器或处理器的内容在C中也可能和Numpy不同,就好像它是另一个编译器或处理器。我特别提到这一点,因为Numpy有一个NaN(不是数字),而这个在C中并不总是存在。

编辑后补充:

我更具体地关注这组操作:(加、减、乘、除、取余,从浮点数转为整数,或反过来)。

我试着查看Numpy的文档,但没有找到有用的信息,也自己做了一些测试,比如:

测试1:int32溢出((uint32_t) 4294967295 + (uint32_t) 1 == 0在C中)

这似乎在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

但这个特定的案例并不能让我确信它在数组中总是有效。

**测试2:负整数除法:**

-1/2 == 0在C中对于int32是这样的。

但在“普通”的Numpy中:

two = np.int64(2)
mone = np.int64(-1)
print(mone / two)
print(mone // two)

结果是:

-0.5
-1

我在想是否有某种“开关”或者操作数可以使用,这样Numpy在上述情况下就能给我0。

1 个回答

0

看起来简单的答案是

  • 负整数的除法表现得不一样:

-1/2 == 0 在C语言中对于int32类型来说是这样。

但是在“普通”的numpy中:

two = np.int64(2)
mone = np.int64(-1)
print(mone / two)
print(mone // two)

而且在numpy中似乎没有“开关”或者其他操作符可以让它表现得像C语言那样

撰写回答