diff --git a/com.oracle.truffle.r.native/fficall/jni/src/arithmetic.c b/com.oracle.truffle.r.native/fficall/jni/src/arithmetic.c new file mode 100644 index 0000000000000000000000000000000000000000..908b4c5ee488206f32d772d496df93a50286bd12 --- /dev/null +++ b/com.oracle.truffle.r.native/fficall/jni/src/arithmetic.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "rffiutils.h" +#include <stdlib.h> + +// FastR: selected functions from arithmetic.c: + +/* + * R : A Computer Language for Statistical Data Analysis + * Copyright (C) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka + * Copyright (C) 1998--2013 The R Core Team. + * Copyright (C) 2003--2015 The R Foundation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, a copy is available at + * http://www.r-project.org/Licenses/ + */ + +typedef union +{ + double value; + unsigned int word[2]; +} ieee_double; + +#ifdef WORDS_BIGENDIAN +static const int hw = 0; +static const int lw = 1; +#else /* !WORDS_BIGENDIAN */ +static const int hw = 1; +static const int lw = 0; +#endif /* WORDS_BIGENDIAN */ + + +static double R_ValueOfNA(void) +{ + /* The gcc shipping with Fedora 9 gets this wrong without + * the volatile declaration. Thanks to Marc Schwartz. */ + volatile ieee_double x; + x.word[hw] = 0x7ff00000; + x.word[lw] = 1954; + return x.value; +} + +int R_IsNA(double x) +{ + if (isnan(x)) { + ieee_double y; + y.value = x; + return (y.word[lw] == 1954); + } + return 0; +} + +int R_IsNaN(double x) +{ + if (isnan(x)) { + ieee_double y; + y.value = x; + return (y.word[lw] != 1954); + } + return 0; +} + +/* Mainly for use in packages */ +int R_finite(double x) +{ +#ifdef HAVE_WORKING_ISFINITE + return isfinite(x); +#else + return (!isnan(x) & (x != R_PosInf) & (x != R_NegInf)); +#endif +} + +#undef _ +#include "../../../gnur/R-3.1.3/src/nmath/nmath.h" + +double fround(double x, double digits) { +#define MAX_DIGITS DBL_MAX_10_EXP + /* = 308 (IEEE); was till R 0.99: (DBL_DIG - 1) */ + /* Note that large digits make sense for very small numbers */ + LDOUBLE pow10, sgn, intx; + int dig; + + if (ISNAN(x) || ISNAN(digits)) + return x + digits; + if(!R_FINITE(x)) return x; + + if(digits == ML_POSINF) return x; + else if(digits == ML_NEGINF) return 0.0; + + if (digits > MAX_DIGITS) digits = MAX_DIGITS; + dig = (int)floor(digits + 0.5); + if(x < 0.) { + sgn = -1.; + x = -x; + } else + sgn = 1.; + if (dig == 0) { + return (double)(sgn * R_rint(x)); + } else if (dig > 0) { + pow10 = R_pow_di(10., dig); + intx = floor(x); + return (double)(sgn * (intx + R_rint((double)((x-intx) * pow10)) / pow10)); + } else { + pow10 = R_pow_di(10., -dig); + return (double)(sgn * R_rint((double)(x/pow10)) * pow10); + } +} + +double Rexp10(double x) { + return pow(10.0, x); +} + +double R_pow_di(double x, int n) +{ + double xn = 1.0; + + if (ISNAN(x)) return x; + if (n == NA_INTEGER) return NA_REAL; + + if (n != 0) { + if (!R_FINITE(x)) return R_POW(x, (double)n); + + Rboolean is_neg = (n < 0); + if(is_neg) n = -n; + for(;;) { + if(n & 01) xn *= x; + if(n >>= 1) x *= x; else break; + } + if(is_neg) xn = 1. / xn; + } + return xn; +} + diff --git a/com.oracle.truffle.r.native/fficall/jni/src/misc.c b/com.oracle.truffle.r.native/fficall/jni/src/misc.c index eef818af3a05d8c85eb0ab839e9ca9eb80fa5ba8..c1b07178009261b17bc42d2bee64454c6884cd86 100644 --- a/com.oracle.truffle.r.native/fficall/jni/src/misc.c +++ b/com.oracle.truffle.r.native/fficall/jni/src/misc.c @@ -25,13 +25,9 @@ #include <string.h> jmethodID iS4ObjectMethodID; -jmethodID isFiniteMethodID; -jmethodID isNAorNaNMethodID; void init_misc(JNIEnv *env) { iS4ObjectMethodID = checkGetMethodID(env, CallRFFIHelperClass, "isS4Object", "(Ljava/lang/Object;)I", 1); - isFiniteMethodID = checkGetMethodID(env, RRuntimeClass, "isFinite", "(D)Z", 1); - isNAorNaNMethodID = checkGetMethodID(env, RRuntimeClass, "isNAorNaN", "(D)Z", 1); } char *dgettext(const char *domainname, const char *msgid) { @@ -76,24 +72,10 @@ void R_CheckStack2(size_t x) { unimplemented("R_CheckStack2"); } -int R_finite(double x) { - JNIEnv *env = getEnv(); - return (*env)->CallStaticBooleanMethod(env, RRuntimeClass, isFiniteMethodID, x); -} - -int R_IsNaN(double x) { - JNIEnv *env = getEnv(); - return (*env)->CallStaticBooleanMethod(env, RRuntimeClass, isNAorNaNMethodID, x); -} - R_len_t R_BadLongVector(SEXP x, const char *y, int z) { unimplemented("R_BadLongVector"); } -int R_IsNA(double x) { - unimplemented("R_IsNA"); -} - int IS_S4_OBJECT(SEXP x) { JNIEnv *env = getEnv(); return (*env)->CallStaticIntMethod(env, CallRFFIHelperClass, iS4ObjectMethodID, x); diff --git a/com.oracle.truffle.r.native/fficall/jni/src/rmathc.c b/com.oracle.truffle.r.native/fficall/jni/src/rmathc.c index 2e5d72c66dbc288ddf46545a5925df3b13c0477c..e0a9b35616b728d82c6e8cf8de7eabb0183fd417 100644 --- a/com.oracle.truffle.r.native/fficall/jni/src/rmathc.c +++ b/com.oracle.truffle.r.native/fficall/jni/src/rmathc.c @@ -116,11 +116,6 @@ double R_pow(double x, double y) { return 0; } -double R_pow_di(double x, int y) { - unimplemented("R_pow_di"); - return 0; -} - double Rf_dchisq(double x, double y, int z) { unimplemented("Rf_dchisq"); return 0;