diff --git a/Core/Algorithms/src/DecouplingApproximationStrategy.cpp b/Core/Algorithms/src/DecouplingApproximationStrategy.cpp
index ae2d14da3a246352d1369b7daf3b883f4f873352..50c2575d89a4f800557511743da92b7372f94b7b 100644
--- a/Core/Algorithms/src/DecouplingApproximationStrategy.cpp
+++ b/Core/Algorithms/src/DecouplingApproximationStrategy.cpp
@@ -19,7 +19,6 @@
 
 #include <cassert>
 #include <iostream>
-#include <cmath>
 
 void DecouplingApproximationStrategy::init(
         const SafePointerVector<FormFactorInfo>& form_factor_infos,
@@ -43,17 +42,17 @@ double DecouplingApproximationStrategy::evaluate(
         complex_t ff =
             m_ff_infos[i]->mp_ff->evaluate(k_i, k_f_bin, alpha_i, alpha_f);
 
-        if (std::isnan(ff.real())) {
+        if (MathFunctions::isnan(ff.real())) {
             std::cout << "Amplitude is NaN: i = " << i << std::endl;
         }
         double fraction = m_ff_infos[i]->m_abundance;
         amplitude += fraction*ff;
         intensity += fraction*(std::norm(ff));
 
-        assert(!std::isnan(amplitude.real()));
-        assert(!std::isnan(amplitude.imag()));
-        assert(!std::isinf(amplitude.real()));
-        assert(!std::isinf(amplitude.imag()));
+        assert(!MathFunctions::isnan(amplitude.real()));
+        assert(!MathFunctions::isnan(amplitude.imag()));
+        assert(!MathFunctions::isinf(amplitude.real()));
+        assert(!MathFunctions::isinf(amplitude.imag()));
 
     }
     double amplitude_norm = std::norm(amplitude);
diff --git a/Core/Algorithms/src/LocalMonodisperseApproximationStrategy.cpp b/Core/Algorithms/src/LocalMonodisperseApproximationStrategy.cpp
index cbfa041f7eaec1190b18d6b51003d9dd85ecb4ab..2fc6069357cc7510e5da7e52b236ae98c621cb5c 100644
--- a/Core/Algorithms/src/LocalMonodisperseApproximationStrategy.cpp
+++ b/Core/Algorithms/src/LocalMonodisperseApproximationStrategy.cpp
@@ -15,6 +15,7 @@
 
 #include "LocalMonodisperseApproximationStrategy.h"
 #include "Exceptions.h"
+#include "MathFunctions.h
 #include <cassert>
 
 
@@ -58,8 +59,8 @@ double LocalMonodisperseApproximationStrategy::evaluate(const cvector_t& k_i,
             intensity += fraction*(itf_function*std::norm(ff));
         }
     }
-    assert(!std::isnan(intensity));
-    assert(!std::isinf(intensity));
+    assert(!MathFunctions::isnan(intensity));
+    assert(!MathFunctions::isinf(intensity));
 
     return intensity;
 }
diff --git a/Core/Tools/inc/MathFunctions.h b/Core/Tools/inc/MathFunctions.h
index 3ea2cc9474704c13d97ab10e08a70122ef40ad0e..e5cb062c98831a98d520b39652cd5953cf23889c 100644
--- a/Core/Tools/inc/MathFunctions.h
+++ b/Core/Tools/inc/MathFunctions.h
@@ -23,6 +23,7 @@
 
 #include <cstdlib>
 #include <vector>
+#include <cmath>
 
 #include "gsl/gsl_sf_bessel.h"
 #include "gsl/gsl_sf_trig.h"
@@ -93,6 +94,25 @@ void FastSinCos(const complex_t &x, complex_t &xsin, complex_t &xcos);
 Eigen::Matrix2d Norm(Eigen::Matrix2cd &M);
 #endif
 
+BA_CORE_API_ bool isnan(double x)
+{
+#ifdef _MSC_VER
+	return _isnan(x);
+#else
+	return std::isnan(x);
+#endif
+}
+
+BA_CORE_API_ bool isinf(double x)
+{
+#ifdef _MSC_VER
+	return !_finite(x);
+#else
+	return std::isinf(x);
+#endif
+}
+
+
 } // Namespace MathFunctions
 
 inline double MathFunctions::GenerateNormalRandom(double average, double std_dev)