Fixed division-by-zero issue in pow() which caused problems for GLC+ with sparse...
[libdai.git] / include / dai / util.h
index dadfead..dba4002 100644 (file)
 
     /// Define NAN
     #define NAN (std::numeric_limits<Real>::quiet_NaN())
+
+    #if defined(_MSC_VER)
+      // Disable unsafe warning (use of the function 'strcpy' instead of 
+      // 'strcpy_s' for portability reasons;
+      #pragma warning( disable : 4996 )
+      // Workaround for the char16_t type defined in Matlab and MSVC 2010
+      #if (_MSC_VER >= 1600)
+        #define __STDC_UTF_16__
+      #endif
+    #endif
 #endif
 
 
@@ -114,9 +124,15 @@ inline Real exp( Real x ) {
     return std::exp(x);
 }
 
-/// Returns \a to the power \a y
+/// Returns \a x to the power \a y
+/** We use the convention that division by zero yields zero;
+ *  for powers, this means that if \a x == 0.0 and \a y < 0.0, we 
+ *  return 0.0 instead of generating an error.
+ */
 inline Real pow( Real x, Real y ) {
     errno = 0;
+    if( x == 0.0 && y < 0.0 )
+        return 0.0;
     Real result = std::pow(x, y);
     DAI_DEBASSERT( errno == 0 );
     return result;