Use C99-defined macros to classify a floating-point number

This commit is contained in:
Nobuyoshi Nakada 2021-08-27 10:52:02 +09:00
parent 3711467362
commit 04be8e84db
No known key found for this signature in database
GPG key ID: 7CD2805BFA3770C6
Notes: git 2021-08-27 15:41:07 +09:00
15 changed files with 11 additions and 205 deletions

View file

@ -7,21 +7,6 @@ reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
#include <stdio.h>
#include <math.h>
#ifdef _WIN32
# include <float.h>
# if !defined __MINGW32__ || defined __NO_ISOCEXT
# ifndef isnan
# define isnan(x) _isnan(x)
# endif
# ifndef isinf
# define isinf(x) (!_finite(x) && !_isnan(x))
# endif
# ifndef finite
# define finite(x) _finite(x)
# endif
# endif
#endif
static double q_gamma(double, double, double);
/* Incomplete gamma function

View file

@ -1,9 +0,0 @@
/* public domain rewrite of finite(3) */
#include "ruby/missing.h"
int
finite(double n)
{
return !isnan(n) && !isinf(n);
}

View file

@ -1,69 +0,0 @@
/* public domain rewrite of isinf(3) */
#ifdef __osf__
#define _IEEE 1
#include <nan.h>
int
isinf(double n)
{
if (IsNANorINF(n) && IsINF(n)) {
return 1;
}
else {
return 0;
}
}
#else
#include "ruby/internal/config.h"
#if defined(HAVE_FINITE) && defined(HAVE_ISNAN)
#include <math.h>
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
/*
* isinf may be provided only as a macro.
* ex. HP-UX, Solaris 10
* http://www.gnu.org/software/automake/manual/autoconf/Function-Portability.html
*/
#ifndef isinf
int
isinf(double n)
{
return (!finite(n) && !isnan(n));
}
#endif
#else
#ifdef HAVE_STRING_H
# include <string.h>
#else
# include <strings.h>
#endif
static double zero(void) { return 0.0; }
static double one (void) { return 1.0; }
static double inf (void) { return one() / zero(); }
int
isinf(double n)
{
static double pinf = 0.0;
static double ninf = 0.0;
if (pinf == 0.0) {
pinf = inf();
ninf = -pinf;
}
return memcmp(&n, &pinf, sizeof n) == 0
|| memcmp(&n, &ninf, sizeof n) == 0;
}
#endif
#endif

View file

@ -1,32 +0,0 @@
/* public domain rewrite of isnan(3) */
#include "ruby/missing.h"
/*
* isnan() may be a macro, a function or both.
* (The C99 standard defines that isnan() is a macro, though.)
* http://www.gnu.org/software/automake/manual/autoconf/Function-Portability.html
*
* macro only: uClibc
* both: GNU libc
*
* This file is compile if no isnan() function is available.
* (autoconf AC_REPLACE_FUNCS detects only the function.)
* The macro is detected by following #ifndef.
*/
#ifndef isnan
static int double_ne(double n1, double n2);
int
isnan(double n)
{
return double_ne(n, n);
}
static int
double_ne(double n1, double n2)
{
return n1 != n2;
}
#endif

View file

@ -14,21 +14,6 @@ reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
#include <math.h>
#include <errno.h>
#ifdef _WIN32
# include <float.h>
# if !defined __MINGW32__ || defined __NO_ISOCEXT
# ifndef isnan
# define isnan(x) _isnan(x)
# endif
# ifndef isinf
# define isinf(x) (!_finite(x) && !_isnan(x))
# endif
# ifndef finite
# define finite(x) _finite(x)
# endif
# endif
#endif
#ifndef HAVE_LGAMMA_R
#include <errno.h>