How to get NaN when I divide by zero

Python

Python Problem Overview


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?

Python Solutions


Solution 1 - Python

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.

Solution 2 - Python

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.

Solution 3 - Python

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

Solution 4 - Python

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

Solution 5 - Python

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKen BloomView Question on Stackoverflow
Solution 1 - PythonSven MarnachView Answer on Stackoverflow
Solution 2 - PythonglglglView Answer on Stackoverflow
Solution 3 - PythonSpacedmanView Answer on Stackoverflow
Solution 4 - PythonBhagirath BhardwajView Answer on Stackoverflow
Solution 5 - PythonColin MacRaeView Answer on Stackoverflow