diff --git a/py/obj.h b/py/obj.h
index 1daa943447f728ca12ac4379d4b91f41c98b6e61..8d40c3f2dd647eafe9f436edc70104962311cbc0 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -201,6 +201,7 @@ extern const mp_obj_type_t mp_type_OverflowError;
 extern const mp_obj_type_t mp_type_OSError;
 extern const mp_obj_type_t mp_type_NotImplementedError;
 extern const mp_obj_type_t mp_type_StopIteration;
+extern const mp_obj_type_t mp_type_ZeroDivisionError;
 
 // Constant objects, globally accessible
 
diff --git a/py/objexcept.c b/py/objexcept.c
index 11177724da8a05b41ad393896918bd390cb1ba80..3f636ffc6d231b650f45a3535079932c3a71ffe9 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -93,6 +93,7 @@ MP_DEFINE_EXCEPTION(OverflowError, BaseException)
 MP_DEFINE_EXCEPTION(OSError, BaseException)
 MP_DEFINE_EXCEPTION(NotImplementedError, BaseException)
 MP_DEFINE_EXCEPTION(StopIteration, BaseException)
+MP_DEFINE_EXCEPTION(ZeroDivisionError, BaseException)
 
 mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type) {
     return mp_obj_new_exception_msg_varg(exc_type, NULL);
diff --git a/py/objfloat.c b/py/objfloat.c
index 401c1145ee3881cc604958e0d838f5360bdf65b0..704b3d5998a7ccde7ca05732c3b3f7d43844947d 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include <assert.h>
+#include <math.h>
 
 #include "nlr.h"
 #include "misc.h"
@@ -105,8 +106,12 @@ mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) {
         case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = lhs_val / rhs_val; break;
         */
         case RT_BINARY_OP_TRUE_DIVIDE:
-        case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: lhs_val /= rhs_val; break;
-
+        case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: 
+            lhs_val /= rhs_val; 
+            if (isinf(lhs_val)){ // check for division by zero
+                nlr_jump(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "float division by zero"));
+            }
+            break;
         case RT_BINARY_OP_LESS: return MP_BOOL(lhs_val < rhs_val);
         case RT_BINARY_OP_MORE: return MP_BOOL(lhs_val > rhs_val);
         case RT_BINARY_OP_LESS_EQUAL: return MP_BOOL(lhs_val <= rhs_val);
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 649f89eb1ed903c429cd9bb3942cff9a1ac571f1..929fcaf0615ea11e790b4805aa8e356dad91b980 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -47,6 +47,7 @@ Q(SyntaxError)
 Q(TypeError)
 Q(ValueError)
 Q(OverflowError)
+Q(ZeroDivisionError)
 
 Q(NoneType)
 
diff --git a/py/runtime.c b/py/runtime.c
index 9c8ba636c03ba3c4c18c62b7370b5ed7eea5a5f0..b57a74fa38be4993898f4d7ae198a142d34ea901 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -158,6 +158,7 @@ STATIC const mp_builtin_elem_t builtin_table[] = {
     { MP_QSTR_OSError, (mp_obj_t)&mp_type_OSError },
     { MP_QSTR_NotImplementedError, (mp_obj_t)&mp_type_NotImplementedError },
     { MP_QSTR_StopIteration, (mp_obj_t)&mp_type_StopIteration },
+    { MP_QSTR_ZeroDivisionError, (mp_obj_t)&mp_type_ZeroDivisionError },
 
     // Extra builtins as defined by a port
     MICROPY_EXTRA_BUILTINS