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)