вывести бесконечное значение - PullRequest
0 голосов
/ 22 октября 2011

В моей программе некоторые вычисления могут дать результаты 1.#INF00 или -1.#IND00 Я хочу напечатать эти результаты - но не как 1.#INF00 и -1.#IND00. Например, для 1. # INF00, я хочу напечатать "бесконечность"

infinity_print(computation(x));//results infinity result 1.#INF00

приведет к появлению на экране "бесконечности"

Как можно реализовать infinity_print?

1 Ответ

1 голос
/ 22 октября 2011

Вы можете использовать макросы isinf (y) в c99. В противном случае это зависит от вашего компилятора, ОС, архитектуры - разные реализации имеют различные недостатки.

Вот несколько возможных вариантов:

#include <math.h> /* isinf */

#ifndef isinf
/* Microsoft C defines _MSC_VER */
#ifdef _MSC_VER
#  include <float.h>
/* 
   from Python source: PC/pyconfig.h Py_IS_INFINITY
*/
#  define isinf(X) (!_finite(X) && !_isnan(X))
#else
#  ifndef isnan
/*
   http://www.gnu.org/software/hello/manual/autoconf/Function-Portability.html
*/
#    define isnan(X) isnan_d(X)
static inline int isnan_d  (double x) { return x != x; }
#  endif /* !isnan */
#  define isinf(X) isinf_d(X)
static inline int isinf_d  (double x) { return !isnan (x) && isnan (x - x); }
#endif /* _MSC_VER */
#endif /* !isinf */

#ifdef gnulib
/*
   http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/isinf.c;hb=HEAD
*/
#undef isinf
#define isinf(X) gl_isinfd(X)
#include <float.h>
static inline int gl_isinfd (double x) { return x < -DBL_MAX || x > DBL_MAX; }
#endif /* gnulib */

Для float, long double реализации аналогичны.

Пример

#include <stdio.h>

int main() {
  double x = 1./0;

  printf("%g", x);
  if (isinf(x))
    puts(" infinity");
  puts("\n");

  return 0;
}
...