как сделать переносную функцию isnan / isinf - PullRequest
37 голосов
/ 12 февраля 2010

Я использую функции isinf, isnan на платформах Linux, которые отлично работали. Но это не сработало в OS-X, поэтому я решил использовать std::isinf std::isnan, который работает как в Linux, так и в OS-X.

Но компилятор Intel не распознает его, и я думаю, что это ошибка в компиляторе Intel согласно http://software.intel.com/en-us/forums/showthread.php?t=64188

Так что теперь я просто хочу избежать хлопот и определить свою собственную реализацию isinf, isnan.

Кто-нибудь знает, как это можно сделать?

редактирование:

В итоге я сделал это в своем исходном коде, чтобы заставить isinf / isnan работать

#include <iostream>
#include <cmath>

#ifdef __INTEL_COMPILER
#include <mathimf.h>
#endif

int isnan_local(double x) { 
#ifdef __INTEL_COMPILER
  return isnan(x);
#else
  return std::isnan(x);
#endif
}

int isinf_local(double x) { 
#ifdef __INTEL_COMPILER
  return isinf(x);
#else
  return std::isinf(x);
#endif
}


int myChk(double a){
  std::cerr<<"val is: "<<a <<"\t";
  if(isnan_local(a))
    std::cerr<<"program says isnan";
  if(isinf_local(a))
    std::cerr<<"program says isinf";
  std::cerr<<"\n";
  return 0;
}

int main(){
  double a = 0;
  myChk(a);
  myChk(log(a));
  myChk(-log(a));
  myChk(0/log(a));
  myChk(log(a)/log(a));

  return 0;
}

Ответы [ 11 ]

0 голосов
/ 23 апреля 2010

это работает на osx

#include <math.h>

также это может быть переносимым,

int isinf( double x ) { return x == x - 1; }

редактирование:

как указал Крис, вышеописанное может потерпеть неудачу при большом x

int isinf( double x ) { return x == x * 2; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...