1.#INF00私のプログラムでは、いくつかの計算で結果が生成される可能性があります。-1.#IND00これらの結果を出力したいのですが、では 1.#INF00ありません-1.#IND00。たとえば、1。#INF00の場合、「無限大」を出力します。
infinity_print(computation(x));//results infinity result 1.#INF00
画面に「無限大」が表示されます
infinity_printはどのように実装できますか?
c99ではisinf(y)マクロを使用できます。それ以外の場合は、コンパイラ、OS、アーキテクチャによって異なります。実装が異なれば、さまざまな欠点があります。
考えられるバリエーションのいくつかを次に示します。
#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;
}