On Fri, 03 Jun 2011 23:04:38 -0700, Ethan Furman wrote: > Steven D'Aprano wrote: >> NANs are not necessarily errors, they're hardly silent, and if you >> don't want NANs, the standard mandates that there be a way to turn them >> off. > > So how does one turn them off in standard Python?
Turn them off? You have to find a way to turn them on first! What makes you think that Python supports IEEE-754 for floats? By default, Decimal raises exceptions for division by zero. >>> import decimal >>> 1/decimal.Decimal(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.1/decimal.py", line 1359, in __rtruediv__ return other.__truediv__(self, context=context) File "/usr/local/lib/python3.1/decimal.py", line 1292, in __truediv__ return context._raise_error(DivisionByZero, 'x / 0', sign) File "/usr/local/lib/python3.1/decimal.py", line 3812, in _raise_error raise error(explanation) decimal.DivisionByZero: x / 0 To get INF or NAN semantics is easy for decimal: >>> decimal.setcontext(decimal.ExtendedContext) >>> 1/decimal.Decimal(0) Decimal('Infinity') but impossible for float. The best you can do is subclass float, or surround each calculation in a try...except, which defeats the point of them. In general, Python goes to great trouble and expense to avoid generating any float INFs or NANs -- and when it does generate them, it's normally at the whim of the C maths library and therefore non-portable. >>> math.sqrt(-1.0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: math domain error >>> decimal.Decimal(-1).sqrt() Decimal('NaN') And sometimes inconsistently so: >>> math.fsum([1, 2, float('inf'), float('nan')]) nan >>> math.fsum([1, 2, float('inf'), float('-inf')]) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: -inf + inf in fsum -- Steven -- http://mail.python.org/mailman/listinfo/python-list