diff --git a/runtime/standard/arithmetic_functions.cc b/runtime/standard/arithmetic_functions.cc index a851ceb39..57be28cda 100644 --- a/runtime/standard/arithmetic_functions.cc +++ b/runtime/standard/arithmetic_functions.cc @@ -14,6 +14,7 @@ #include "runtime/standard/arithmetic_functions.h" +#include #include #include @@ -139,6 +140,17 @@ Value Div(double v0, double v1) { static_assert(std::numeric_limits::is_iec559, "Division by zero for doubles must be supported"); + if (v1 == 0.0) { + if (v0 == 0.0 || std::isnan(v0)) { + return DoubleValue(std::numeric_limits::quiet_NaN()); + } + double inf = std::numeric_limits::infinity(); + if (std::signbit(v0) != std::signbit(v1)) { + return DoubleValue(-inf); + } + return DoubleValue(inf); + } + // For double, division will result in +/- inf return DoubleValue(v0 / v1); }