1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

add missing/nan.c

instead of scattering #ifdef HAVE_NANF here and there define our
own nan() unless defined elsewhere.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61971 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2018-01-20 03:16:59 +00:00
parent 76b609c8c3
commit 782236e3bd
5 changed files with 31 additions and 22 deletions

View file

@ -2266,6 +2266,7 @@ AC_REPLACE_FUNCS(isinf)
AC_REPLACE_FUNCS(isnan) AC_REPLACE_FUNCS(isnan)
AC_REPLACE_FUNCS(lgamma_r) AC_REPLACE_FUNCS(lgamma_r)
AC_REPLACE_FUNCS(memmove) AC_REPLACE_FUNCS(memmove)
AC_REPLACE_FUNCS(nan)
AC_REPLACE_FUNCS(nextafter) AC_REPLACE_FUNCS(nextafter)
AC_REPLACE_FUNCS(setproctitle) AC_REPLACE_FUNCS(setproctitle)
AC_REPLACE_FUNCS(strchr) AC_REPLACE_FUNCS(strchr)
@ -2396,7 +2397,6 @@ AC_CHECK_FUNCS(memmem)
AC_CHECK_FUNCS(mkfifo) AC_CHECK_FUNCS(mkfifo)
AC_CHECK_FUNCS(mknod) AC_CHECK_FUNCS(mknod)
AC_CHECK_FUNCS(mktime) AC_CHECK_FUNCS(mktime)
AC_CHECK_FUNCS(nanf) # We need nan(), but HAVE_NAN conflicts...
AC_CHECK_FUNCS(openat) AC_CHECK_FUNCS(openat)
AC_CHECK_FUNCS(pipe2) AC_CHECK_FUNCS(pipe2)
AC_CHECK_FUNCS(poll) AC_CHECK_FUNCS(poll)

View file

@ -1678,12 +1678,7 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
const char *ptr = RSTRING_PTR(str); const char *ptr = RSTRING_PTR(str);
if (strcmp(ptr, "nan") == 0) { if (strcmp(ptr, "nan") == 0) {
d = d = nan("");
#ifdef HAVE_NANF
nan("");
#else
(double)NAN;
#endif
} }
else if (strcmp(ptr, "inf") == 0) { else if (strcmp(ptr, "inf") == 0) {
d = HUGE_VAL; d = HUGE_VAL;

28
missing/nan.c Normal file
View file

@ -0,0 +1,28 @@
#include "ruby/missing.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
double
nan(const char *spec)
{
#if 0
/* FIXME: we have not yet seen any situation this is
* necessary. Please write a proper implementation that
* covers this branch. */
if (spec && spec[0]) {
double generated_nan;
int len = snprintf(NULL, 0, "NAN(%s)", spec);
char *buf = malloc(len + 1); /* +1 for NUL */
sprintf(buf, "NAN(%s)", spec);
generated_nan = strtod(buf, NULL);
free(buf);
return generated_nan;
}
else
#endif
{
assert(!spec || !spec[0]);
return (double)NAN;
}
}

View file

@ -3651,11 +3651,7 @@ rb_int_fdiv_double(VALUE x, VALUE y)
return rb_big_fdiv_double(x, y); return rb_big_fdiv_double(x, y);
} }
else { else {
#ifdef HAVE_NANF
return nan(""); return nan("");
#else
return (double)NAN;
#endif
} }
} }
@ -5565,13 +5561,7 @@ Init_Numeric(void)
/* /*
* An expression representing a value which is "not a number". * An expression representing a value which is "not a number".
*/ */
rb_define_const(rb_cFloat, "NAN", rb_define_const(rb_cFloat, "NAN", DBL2NUM(nan("")));
#ifdef HAVE_NANF
DBL2NUM(nan(""))
#else
DBL2NUM((double)NAN)
#endif
);
rb_define_method(rb_cFloat, "to_s", flo_to_s, 0); rb_define_method(rb_cFloat, "to_s", flo_to_s, 0);
rb_define_alias(rb_cFloat, "inspect", "to_s"); rb_define_alias(rb_cFloat, "inspect", "to_s");

View file

@ -1073,11 +1073,7 @@ nurat_expt(VALUE self, VALUE other)
} }
if (RB_FLOAT_TYPE_P(num)) { /* infinity due to overflow */ if (RB_FLOAT_TYPE_P(num)) { /* infinity due to overflow */
if (RB_FLOAT_TYPE_P(den)) if (RB_FLOAT_TYPE_P(den))
#ifdef HAVE_NANF
return DBL2NUM(nan("")); return DBL2NUM(nan(""));
#else
return DBL2NUM((double)NAN);
#endif
return num; return num;
} }
if (RB_FLOAT_TYPE_P(den)) { /* infinity due to overflow */ if (RB_FLOAT_TYPE_P(den)) { /* infinity due to overflow */