Ken Bloom
Ken Bloom

Reputation: 58810

How to get NaN when I divide by zero

When I do floating point division in Python, if I divide by zero, I get an exception:

>>> 1.0/0.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division

I'd really like to get NaN or Inf instead (because the NaN or Inf will propagate through the rest of my calculation correctly and not kill my program).

How can I do this?

Upvotes: 78

Views: 69211

Answers (5)

glglgl
glglgl

Reputation: 91149

Method 1:

try:
    value = a/b
except ZeroDivisionError:
    value = float('Inf')

Method 2:

if b != 0:
    value = a / b
else:
    value = float('Inf')

But be aware that the value could as well be -Inf, so you should make a more distinctive test. Nevertheless, this above should give you the idea how to do it.

Upvotes: 28

Colin MacRae
Colin MacRae

Reputation: 33

I used a wrapper function in a python program of mine for a simple division that was returning ZeroDivisionError when the sensors I was using weren't plugged in. It simply returns 0 (zero), which in real-world terms is what I wanted. Probably gets messy with more variables, however...

def calculation(a, b):
    if a == 0:
        return 0
    elif b == 0:
        return 0
    else:
        return a/b

Upvotes: -6

Bhagirath Bhardwaj
Bhagirath Bhardwaj

Reputation: 56

If i understand your problem properly then this should be the solution:

try:
   1.0/0.0
except:    
   return 'inf'

you can modified it according to various python exception handling method available

Upvotes: -6

Spacedman
Spacedman

Reputation: 94317

You could try using the 'decimal' module:

>>> from decimal import *
>>> setcontext(ExtendedContext)
>>> inf = Decimal(1) / Decimal(0)
>>> print(inf)
Infinity
>>> neginf = Decimal(-1) / Decimal(0)
>>> print(neginf)
-Infinity
>>> print(neginf + inf)
NaN
>>> print(neginf * inf)
-Infinity
>>> print(dig / 0)
Infinity

Upvotes: 10

Sven Marnach
Sven Marnach

Reputation: 602695

The easiest way to get this behaviour is to use numpy.float64 instead of Python default float type:

>>> import numpy
>>> numpy.float64(1.0) / 0.0
inf

Of course this requires NumPy. You can use numpy.seterr() to fine-tune the error handling.

Upvotes: 82

Related Questions