所以你想放弃“唯一正确的方法”,并在溢出方面走复古路线。真是傻。
C / C++ / C# / Java风格的溢出没有好处。它不能可靠地引发错误条件。对于C和C99,它在ANSI和POSIX中是“未定义行为”(C ++强制执行模数返回),而且这是已知的安全风险。你为什么要这样做?
Python方法可以无缝地溢出到long,这是更好的方法。我相信Perl 6正在采用相同的行为。
你可以使用Decimal模块来获取更多有限的溢出:
>>> from decimal import *
>>> from sys import maxint
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1,
flags=[], traps=[DivisionByZero, Overflow, InvalidOperation])
>>> d=Decimal(maxint)
>>> d
Decimal('9223372036854775807')
>>> e=Decimal(maxint)
>>> f=d**e
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 2225, in __pow__
ans = ans._fix(context)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 1589, in _fix
return context._raise_error(Overflow, 'above Emax', self._sign)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/decimal.py", line 3680, in _raise_error
raise error(explanation)
decimal.Overflow: above Emax
您可以使用Decimal类设置精度和边界条件,溢出几乎是即时的。 您可以设置要捕获的内容,可以设置最大值和最小值。 真的 - 如何才能比这更好呢? (老实说,我不知道相对速度如何,但我怀疑它比numby快但比本机整数慢...)
对于您处理图像的特定问题,这听起来像是考虑某种形式的饱和算术的自然应用。如果您在32位算术中遇到溢出,您也可以检查明显情况下的操作数:pow,**,*。您可以考虑重载运算符并检查您不想要的条件。
如果Decimal、饱和或重载运算符无法解决问题,您可以编写扩展程序。如果您想摒弃Python的溢出方式而回归早期,则需要看天意了...
Decimal
模块。 - Falmarri