0

我在 Matlab 中实现了一种数值方法。但是我的公式有问题,或者 Matlab 似乎很傻。我想在 Matlab 中得到 1920 但结果如下。python解释器给出

>>> x0_square = 3200
>>> x0 = 2560
>>> scale_factor = 2048
>>> x = 2048
>>> a = x0_square +  ( ( (2 * x0) * (x - x0) ) / scale_factor)
>>> print a
1920

但是Matlab给出

% all variables here is int16. all value are the same as the above.
>> x_square_a = int16(x0_square +  ( ( (2 .* x0) .* (x - x0) ) ./ scale_factor));
>> x_square_a

x_square_a =

   3184

为什么他们给出不同的结果?如何从 Matlab 解释器中获取 1920?此外,我受到限制,除了 int16 之外,不能使用任何变量。

4

2 回答 2

3

问题是您int16在 Matlab 中使用。Python 的整数具有无限精度,因此不会溢出。如果你numpy.int16在 Python 代码中大量使用,你会得到

RuntimeWarning: overflow encountered in short_scalars

所以这绝对是一个溢出问题。


在 Python 中使用numpy.int16s 的解决方案是更早地移动除法:

x0_square = int16(3200)
x0 = int16(2560)
scale_factor = int16(2048)
x = int16(2048)
a = int16(x0_square +  ( ( (int16(2) * x0)  / scale_factor * (x - x0) )))
a
#>>> 1920

所以这表明matlab代码应该是

x_square_a = int16(x0_square +  ( ( (2 .* x0) ./ scale_factor .* (x - x0) )));
于 2013-09-28T12:47:06.260 回答
1

只是用HP计算器手工计算;它确认你应该得到 1920。

价值2*2,560*(2,048-2,560) = -1,310,720。最大的 16 位整数是2^16 = 65,536.

Veedrac 击中了它的头部 - 溢出。尝试 32 位整数。

于 2013-09-28T12:52:26.050 回答