mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
1883 lines
42 KiB
C
1883 lines
42 KiB
C
|
/*
|
||
|
* @(#) $(JCGO)/include/jcgomath.c --
|
||
|
* a part of the JCGO runtime subsystem.
|
||
|
**
|
||
|
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
|
||
|
* Copyright (C) 2001-2012 Ivan Maidanski <ivmai@ivmaisoft.com>
|
||
|
* All rights reserved.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* This file is compiled together with the files produced by the JCGO
|
||
|
* translator (do not include and/or compile this file directly).
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* This 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, or (at your option)
|
||
|
* any later version.
|
||
|
**
|
||
|
* This software 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 (GPL) for more details.
|
||
|
**
|
||
|
* Linking this library statically or dynamically with other modules is
|
||
|
* making a combined work based on this library. Thus, the terms and
|
||
|
* conditions of the GNU General Public License cover the whole
|
||
|
* combination.
|
||
|
**
|
||
|
* As a special exception, the copyright holders of this library give you
|
||
|
* permission to link this library with independent modules to produce an
|
||
|
* executable, regardless of the license terms of these independent
|
||
|
* modules, and to copy and distribute the resulting executable under
|
||
|
* terms of your choice, provided that you also meet, for each linked
|
||
|
* independent module, the terms and conditions of the license of that
|
||
|
* module. An independent module is a module which is not derived from
|
||
|
* or based on this library. If you modify this library, you may extend
|
||
|
* this exception to your version of the library, but you are not
|
||
|
* obligated to do so. If you do not wish to do so, delete this
|
||
|
* exception statement from your version.
|
||
|
*/
|
||
|
|
||
|
#ifdef JCGO_VER
|
||
|
|
||
|
#ifndef JCGO_NOFP
|
||
|
#include "jcgomath.h"
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_sin__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__sin__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return (jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return sinl(a);
|
||
|
#else
|
||
|
return sin(a);
|
||
|
#endif
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
v = sinl(a);
|
||
|
if (JCGO_FP_NOTNAN(v) &&
|
||
|
JCGO_EXPECT_TRUE(v >= (jdouble)-1.0 && v <= (jdouble)1.0))
|
||
|
return v;
|
||
|
a = sinl(fmodl(a, (jdouble)2.0 * M_PIl));
|
||
|
}
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a <= -DBL_MIN || a >= DBL_MIN))
|
||
|
{
|
||
|
v = sin(a);
|
||
|
if (JCGO_FP_NOTNAN(v) && JCGO_EXPECT_TRUE(v >= -1.0 && v <= 1.0))
|
||
|
return v;
|
||
|
a = sin(fmod(a, 2.0 * M_PI));
|
||
|
}
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_cos__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__cos__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return a == (jdouble)0 ? (jdouble)1 : (jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return cosl(a);
|
||
|
#else
|
||
|
return cos(a);
|
||
|
#endif
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
v = cosl(a);
|
||
|
if (JCGO_FP_NOTNAN(v) &&
|
||
|
JCGO_EXPECT_TRUE(v >= (jdouble)-1.0 && v <= (jdouble)1.0))
|
||
|
return v;
|
||
|
return cosl(fmodl(a, (jdouble)2.0 * M_PIl));
|
||
|
#else
|
||
|
v = cos(a);
|
||
|
if (JCGO_FP_NOTNAN(v) && JCGO_EXPECT_TRUE(v >= -1.0 && v <= 1.0))
|
||
|
return v;
|
||
|
return cos(fmod(a, 2.0 * M_PI));
|
||
|
#endif
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_tan__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__tan__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble vf;
|
||
|
jdouble dd;
|
||
|
jdouble df;
|
||
|
jdouble c;
|
||
|
jdouble p;
|
||
|
int sign;
|
||
|
int j;
|
||
|
int n;
|
||
|
int k = 0;
|
||
|
v = (jdouble)0;
|
||
|
if (a != (jdouble)0)
|
||
|
{
|
||
|
sign = 1;
|
||
|
if (a < (jdouble)0)
|
||
|
{
|
||
|
sign = 0;
|
||
|
a = -a;
|
||
|
}
|
||
|
j = (int)sizeof(jlong) * 8;
|
||
|
c = (jdouble)((((u_jlong)0xC90FDAA2L) << ((int)sizeof(jlong) * 8 - 32)) |
|
||
|
(j > 32 ? ((u_jlong)0x2168C235L) >> ((32 << 1) - j) : (u_jlong)0L));
|
||
|
n = j;
|
||
|
do
|
||
|
{
|
||
|
dd = a;
|
||
|
k = k << 1;
|
||
|
a = a + a;
|
||
|
if (dd < (jdouble)0 || (u_jlong)a >= (u_jlong)c)
|
||
|
{
|
||
|
k++;
|
||
|
a = a - c;
|
||
|
}
|
||
|
} while (--n > 0);
|
||
|
if ((((k & 0x3) - 1) >> 1) == 0)
|
||
|
{
|
||
|
v = (jdouble)1;
|
||
|
if ((k & 0x3) == 0x1)
|
||
|
{
|
||
|
a = c - a;
|
||
|
sign = 1 - sign;
|
||
|
}
|
||
|
if (a >= (jdouble)0)
|
||
|
{
|
||
|
v = a;
|
||
|
if (a != (jdouble)0)
|
||
|
{
|
||
|
dd = a;
|
||
|
k = 0;
|
||
|
for (;;)
|
||
|
{
|
||
|
df = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) - (jdouble)1;
|
||
|
vf = (jdouble)((jlong)v & (jlong)df);
|
||
|
df = (jdouble)((jlong)dd & (jlong)df);
|
||
|
v = (jdouble)(((u_jlong)v) >> ((int)sizeof(jlong) * 4));
|
||
|
p = (jdouble)(((u_jlong)dd) >> ((int)sizeof(jlong) * 4));
|
||
|
vf = (jdouble)(((u_jlong)(vf * df)) >> ((int)sizeof(jlong) * 4)) +
|
||
|
vf * p;
|
||
|
df = v * df;
|
||
|
vf = df + vf;
|
||
|
v = (jdouble)(((u_jlong)vf) >> ((int)sizeof(jlong) * 4)) + v * p;
|
||
|
if ((u_jlong)vf < (u_jlong)df)
|
||
|
v = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) + v;
|
||
|
if (c == (jdouble)0)
|
||
|
break;
|
||
|
switch (n)
|
||
|
{
|
||
|
case 0:
|
||
|
p = (jdouble)((jlong)0x1B2A7L);
|
||
|
c = (jdouble)((u_jlong)0x74BF7ADL);
|
||
|
break;
|
||
|
case 1:
|
||
|
p = (jdouble)((jlong)0xFFFEC8A3L);
|
||
|
c = (jdouble)((u_jlong)0x4249FACAL);
|
||
|
break;
|
||
|
case 2:
|
||
|
p = (jdouble)((jlong)0x4AE03L);
|
||
|
c = (jdouble)((u_jlong)0xCCBC29FAL);
|
||
|
break;
|
||
|
case 3:
|
||
|
p = (jdouble)((jlong)0x51FA2L);
|
||
|
c = (jdouble)((u_jlong)0x280DE4A9L);
|
||
|
break;
|
||
|
case 4:
|
||
|
p = (jdouble)((jlong)0x1026F7L);
|
||
|
c = (jdouble)((u_jlong)0x1A8D1068L);
|
||
|
break;
|
||
|
case 5:
|
||
|
p = (jdouble)((jlong)0x2689B1L);
|
||
|
c = (jdouble)((u_jlong)0xE5E4CA02L);
|
||
|
break;
|
||
|
case 6:
|
||
|
p = (jdouble)((jlong)0x5F6F23L);
|
||
|
c = (jdouble)((u_jlong)0xFB820C54L);
|
||
|
break;
|
||
|
case 7:
|
||
|
p = (jdouble)((jlong)0xEB6916L);
|
||
|
c = (jdouble)((u_jlong)0x4AB01940L);
|
||
|
break;
|
||
|
case 8:
|
||
|
p = (jdouble)((jlong)0x244DC7DL);
|
||
|
c = (jdouble)((u_jlong)0x2DD09260L);
|
||
|
break;
|
||
|
case 9:
|
||
|
p = (jdouble)((jlong)0x5993D21L);
|
||
|
c = (jdouble)((u_jlong)0x1B58DC0L);
|
||
|
break;
|
||
|
case 10:
|
||
|
p = (jdouble)((jlong)0xDD0DD0DL);
|
||
|
c = (jdouble)((u_jlong)0xD9A0FF00L);
|
||
|
break;
|
||
|
case 11:
|
||
|
p = (jdouble)((jlong)0x22222222L);
|
||
|
c = (jdouble)((u_jlong)0x21FCF400L);
|
||
|
break;
|
||
|
case 12:
|
||
|
p = (jdouble)((jlong)0x55555555L);
|
||
|
c = (jdouble)((u_jlong)0x55558C00L);
|
||
|
break;
|
||
|
default:
|
||
|
c = (jdouble)0;
|
||
|
break;
|
||
|
}
|
||
|
if (c != (jdouble)0)
|
||
|
{
|
||
|
c = (jdouble)(((u_jlong)p << ((int)sizeof(jlong) * 8 - 32)) |
|
||
|
(j > 32 ? ((u_jlong)c) >> ((32 << 1) - j) : (u_jlong)0L));
|
||
|
if (n == 0)
|
||
|
{
|
||
|
dd = v;
|
||
|
v = (jdouble)0;
|
||
|
}
|
||
|
if (k != 0)
|
||
|
c = -c;
|
||
|
v = v + c;
|
||
|
if (c < (jdouble)0 && (u_jlong)v >= (u_jlong)c)
|
||
|
{
|
||
|
v = -v;
|
||
|
k = 1 - k;
|
||
|
}
|
||
|
}
|
||
|
else dd = a;
|
||
|
n++;
|
||
|
}
|
||
|
if (k != 0)
|
||
|
v = -v;
|
||
|
v = a + v;
|
||
|
}
|
||
|
if ((u_jlong)v <= (u_jlong)1L)
|
||
|
return sign != 0 ? (jdouble)((jlong)(~(((u_jlong)-1L) >> 1))) :
|
||
|
(jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
v = (jdouble)((u_jlong)(-v) / (u_jlong)v) + (jdouble)1;
|
||
|
}
|
||
|
if (sign != 0)
|
||
|
v = -v;
|
||
|
}
|
||
|
}
|
||
|
return v;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return tanl(a);
|
||
|
#else
|
||
|
return tan(a);
|
||
|
#endif
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
v = tanl(a);
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
return v;
|
||
|
a = tanl(fmodl(a, M_PIl));
|
||
|
}
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a <= -DBL_MIN || a >= DBL_MIN))
|
||
|
{
|
||
|
v = tan(a);
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
return v;
|
||
|
a = tan(fmod(a, M_PI));
|
||
|
}
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_asin__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__asin__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return a == (jdouble)-1 || a == (jdouble)1 ? a : (jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return asinl(a);
|
||
|
#else
|
||
|
return asin(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a) &&
|
||
|
JCGO_EXPECT_TRUE(a >= (jdouble)-1.0 && a <= (jdouble)1.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
a = asinl(a);
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a <= -DBL_MIN || a >= DBL_MIN))
|
||
|
a = asin(a);
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_acos__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__acos__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return a == (jdouble)0 ? (jdouble)1 : a == (jdouble)-1 ? (jdouble)3 :
|
||
|
(jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return acosl(a);
|
||
|
#else
|
||
|
return acos(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a) &&
|
||
|
JCGO_EXPECT_TRUE(a >= (jdouble)-1.0 && a <= (jdouble)1.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return acosl(a);
|
||
|
#else
|
||
|
return acos(a);
|
||
|
#endif
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_atan__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__atan__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return a >= (jdouble)2 ? (jdouble)1 : a <= (jdouble)-2 ? (jdouble)-1 :
|
||
|
(jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return atanl(a);
|
||
|
#else
|
||
|
return atan(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
a = atanl(a);
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a <= -DBL_MIN || a >= DBL_MIN))
|
||
|
a = atan(a);
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = a < (jdouble)0.0 ? -M_PIl / (jdouble)2.0 : M_PIl / (jdouble)2.0;
|
||
|
#else
|
||
|
a = a < 0.0 ? -M_PI / 2.0 : M_PI / 2.0;
|
||
|
#endif
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_atan2__DD
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__atan2__DD( jdouble y, jdouble x )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
if (y == (jdouble)0)
|
||
|
return x < (jdouble)0 ? (jdouble)3 : (jdouble)0;
|
||
|
if (x == (jdouble)0)
|
||
|
return y < (jdouble)0 ? (jdouble)-1 : (jdouble)1;
|
||
|
v = y;
|
||
|
if (y < (jdouble)0)
|
||
|
y = -y;
|
||
|
if (x < (jdouble)0)
|
||
|
{
|
||
|
x = -x;
|
||
|
y = (u_jlong)y > (u_jlong)x && (jdouble)((((u_jlong)x & (((u_jlong)1L <<
|
||
|
((int)sizeof(jlong) * 4)) - (u_jlong)1L)) * (((u_jlong)0x2F5EC5C1L) >>
|
||
|
(32 - (int)sizeof(jlong) * 4))) >> ((int)sizeof(jlong) * 4)) +
|
||
|
(jdouble)(((u_jlong)x) >> ((int)sizeof(jlong) * 4)) *
|
||
|
(jdouble)(((u_jlong)0x2F5EC5C1L) >> (32 - (int)sizeof(jlong) * 4)) <
|
||
|
(y - x) - x ? (jdouble)1 : ((((u_jlong)x & (((u_jlong)1L <<
|
||
|
((int)sizeof(jlong) * 4)) - (u_jlong)1L)) * (((u_jlong)0x247DEE24L) >>
|
||
|
(32 - (int)sizeof(jlong) * 4))) >> ((int)sizeof(jlong) * 4)) +
|
||
|
(((u_jlong)x) >> ((int)sizeof(jlong) * 4)) * (((u_jlong)0x247DEE24L) >>
|
||
|
(32 - (int)sizeof(jlong) * 4)) < (u_jlong)y ? (jdouble)2 : (jdouble)3;
|
||
|
}
|
||
|
else y = (jdouble)(((((u_jlong)x & (((u_jlong)1L <<
|
||
|
((int)sizeof(jlong) * 4)) - (u_jlong)1L)) *
|
||
|
(((u_jlong)0x8EB245CBL) >> (32 - (int)sizeof(jlong) * 4))) >>
|
||
|
((int)sizeof(jlong) * 4)) + (((u_jlong)x) >>
|
||
|
((int)sizeof(jlong) * 4)) * (((u_jlong)0x8EB245CBL) >>
|
||
|
(32 - (int)sizeof(jlong) * 4))) < y - x ? (jdouble)1 : (jdouble)0;
|
||
|
if (v < (jdouble)0)
|
||
|
y = -y;
|
||
|
return y;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return atan2l(y, x);
|
||
|
#else
|
||
|
return atan2(y, x);
|
||
|
#endif
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(y))
|
||
|
{
|
||
|
if (JCGO_FP_FINITE(x))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(y != (jdouble)0.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
if (JCGO_EXPECT_TRUE(x != (jdouble)0.0))
|
||
|
{
|
||
|
v = y;
|
||
|
if (y < (jdouble)0.0)
|
||
|
y = -y;
|
||
|
y = atan2l(y, x);
|
||
|
if (v < (jdouble)0.0)
|
||
|
y = -y;
|
||
|
return y;
|
||
|
}
|
||
|
return y < (jdouble)0.0 ? -M_PIl / (jdouble)2.0 : M_PIl / (jdouble)2.0;
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(x != 0.0))
|
||
|
{
|
||
|
if (JCGO_EXPECT_FALSE((y > -DBL_MIN && y < DBL_MIN) ||
|
||
|
(x > -DBL_MIN && x < DBL_MIN)))
|
||
|
{
|
||
|
v = y * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)));
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
y = v;
|
||
|
v = x * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)));
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
x = v;
|
||
|
}
|
||
|
return y < 0.0 ? -atan2(-y, x) : atan2(y, x);
|
||
|
}
|
||
|
return y < 0.0 ? -M_PI / 2.0 : M_PI / 2.0;
|
||
|
#endif
|
||
|
}
|
||
|
if (x <= (jdouble)0.0 && (x != (jdouble)0.0 || JCGO_FP_ZEROISNEG(x)))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
x = M_PIl;
|
||
|
#else
|
||
|
x = M_PI;
|
||
|
#endif
|
||
|
if (JCGO_FP_ZEROISNEG(y))
|
||
|
x = -x;
|
||
|
return x;
|
||
|
}
|
||
|
return y;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(x))
|
||
|
{
|
||
|
if (y != (jdouble)0.0)
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
x = x < (jdouble)0.0 ? M_PIl : (jdouble)0.0;
|
||
|
#else
|
||
|
x = x < 0.0 ? M_PI : 0.0;
|
||
|
#endif
|
||
|
if (y < (jdouble)0.0)
|
||
|
x = -x;
|
||
|
return x;
|
||
|
}
|
||
|
if (x < (jdouble)0.0)
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
x = M_PIl;
|
||
|
#else
|
||
|
x = M_PI;
|
||
|
#endif
|
||
|
if (JCGO_FP_ZEROISNEG(y))
|
||
|
x = -x;
|
||
|
return x;
|
||
|
}
|
||
|
return y;
|
||
|
}
|
||
|
return x;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(y))
|
||
|
{
|
||
|
if (JCGO_FP_FINITE(x))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return y < (jdouble)0.0 ? -M_PIl / (jdouble)2.0 : M_PIl / (jdouble)2.0;
|
||
|
#else
|
||
|
return y < 0.0 ? -M_PI / 2.0 : M_PI / 2.0;
|
||
|
#endif
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(x))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
x = x < (jdouble)0.0 ? M_PIl - M_PIl / (jdouble)4.0 :
|
||
|
M_PIl / (jdouble)4.0;
|
||
|
#else
|
||
|
x = x < 0.0 ? M_PI - M_PI / 4.0 : M_PI / 4.0;
|
||
|
#endif
|
||
|
if (y < (jdouble)0.0)
|
||
|
x = -x;
|
||
|
}
|
||
|
return x;
|
||
|
}
|
||
|
return y;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_exp__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__exp__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble vf;
|
||
|
jdouble m;
|
||
|
jdouble mf;
|
||
|
jdouble p;
|
||
|
int j = 0;
|
||
|
if (a <= (jdouble)0)
|
||
|
return a == (jdouble)0 ? (jdouble)1 : (jdouble)0;
|
||
|
if (a > (jdouble)(((u_jint)0x2C5L *
|
||
|
(u_jint)((int)sizeof(jlong) * 8 - 1)) >> 10))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
v = (jdouble)1;
|
||
|
m = (jdouble)1;
|
||
|
vf = (jdouble)0;
|
||
|
mf = (jdouble)0;
|
||
|
for (;;)
|
||
|
{
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 8 - 12)) + a * m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
mf = (jdouble)((((u_jlong)(m - p * j) << ((int)sizeof(jlong) * 8 - 12)) +
|
||
|
((u_jlong)mf & (((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)) -
|
||
|
(u_jlong)1L))) / (u_jlong)j);
|
||
|
m = p;
|
||
|
vf = vf + mf;
|
||
|
v = v + m;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
{
|
||
|
v++;
|
||
|
vf = vf - (jdouble)((jlong)1L << ((int)sizeof(jlong) * 8 - 12));
|
||
|
}
|
||
|
else if (m == (jdouble)0 && (((u_jlong)mf) >> 1) + (u_jlong)vf <=
|
||
|
((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
break;
|
||
|
mf = a * mf;
|
||
|
}
|
||
|
m = (jdouble)(((u_jlong)v) >> ((int)sizeof(jlong) * 8 - 11));
|
||
|
if (m > (jdouble)0)
|
||
|
{
|
||
|
j = 0;
|
||
|
do
|
||
|
{
|
||
|
j++;
|
||
|
} while ((m = (jdouble)((jlong)m >> 1)) > (jdouble)0);
|
||
|
m = (jdouble)((jlong)1L << (j - 1));
|
||
|
p = (m + m) + m;
|
||
|
if ((jdouble)((u_jlong)v & (u_jlong)p) == p)
|
||
|
v = m + v;
|
||
|
v = (jdouble)((u_jlong)(-(m + m)) & (u_jlong)v);
|
||
|
}
|
||
|
return v;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return expl(a);
|
||
|
#else
|
||
|
return exp(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return JCGO_EXPECT_TRUE(a < (jdouble)(LN_MAXLDOUBLE - 0.1)) ? expl(a) :
|
||
|
a < (jdouble)(LN_MAXLDOUBLE + 0.9) ? expl(a - (jdouble)1.0) * M_El :
|
||
|
jcgo_fpInf;
|
||
|
#else
|
||
|
return JCGO_EXPECT_TRUE(a < LN_MAXDOUBLE - 0.1) ?
|
||
|
(JCGO_EXPECT_FALSE(a > -LN_MINDOUBLE - 0.1 &&
|
||
|
a < LN_MINDOUBLE + 0.1) ? (a >= 0.0 ? exp(a +
|
||
|
DBL_MANT_DIG * M_LN2) / ((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2))) : exp(a - DBL_MANT_DIG * M_LN2) *
|
||
|
((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2)))) : exp(a)) :
|
||
|
a < LN_MAXDOUBLE + 0.9 ? exp(a - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a) && a < (jdouble)0.0)
|
||
|
a = (jdouble)0.0;
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_log__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__log__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble m;
|
||
|
jdouble p;
|
||
|
jdouble r;
|
||
|
jdouble mf;
|
||
|
jdouble df;
|
||
|
int j;
|
||
|
int k = 0;
|
||
|
if (a <= (jdouble)0)
|
||
|
return a < (jdouble)0 ? (jdouble)0 :
|
||
|
(jdouble)((jlong)(~(((u_jlong)-1L) >> 1)));
|
||
|
if (a > (jdouble)1)
|
||
|
{
|
||
|
v = a;
|
||
|
k = (int)sizeof(jlong) * 8 - 2;
|
||
|
while ((a = a + a) >= (jdouble)0)
|
||
|
k--;
|
||
|
if (k >= (int)sizeof(jlong) * 8 - 11)
|
||
|
{
|
||
|
a = (jdouble)(((jlong)v - (jlong)1L) >>
|
||
|
(k - ((int)sizeof(jlong) * 8 - 11)));
|
||
|
if (((int)a & 0x3) != 0x3)
|
||
|
a = a + (jdouble)2;
|
||
|
a = (jdouble)(((jlong)a >> 1) << 11);
|
||
|
}
|
||
|
j = (int)sizeof(jlong) * 8;
|
||
|
r = (jdouble)((((u_jlong)0xB17217F7L) << ((int)sizeof(jlong) * 8 - 32)) |
|
||
|
(j > 32 ? ((u_jlong)0xD1CF79ABL) >> ((32 << 1) - j) : (u_jlong)0L)) *
|
||
|
(jdouble)k;
|
||
|
a = a + a;
|
||
|
k = (int)(((u_jint)k * (u_jint)0x2C5L) >> 10);
|
||
|
j = 1;
|
||
|
v = a;
|
||
|
m = a;
|
||
|
for (;;)
|
||
|
{
|
||
|
df = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) - (jdouble)1;
|
||
|
mf = (jdouble)((jlong)m & (jlong)df);
|
||
|
df = (jdouble)((jlong)a & (jlong)df);
|
||
|
m = (jdouble)(((u_jlong)m) >> ((int)sizeof(jlong) * 4));
|
||
|
p = (jdouble)(((u_jlong)a) >> ((int)sizeof(jlong) * 4));
|
||
|
mf = (jdouble)(((u_jlong)(mf * df)) >> ((int)sizeof(jlong) * 4)) + mf * p;
|
||
|
df = m * df;
|
||
|
mf = df + mf;
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 4)) + m * p;
|
||
|
if ((u_jlong)mf < (u_jlong)df)
|
||
|
m = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) + m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
if ((j & 1) == 0)
|
||
|
{
|
||
|
v = v - p;
|
||
|
if ((u_jlong)(v + r) < (u_jlong)v)
|
||
|
{
|
||
|
k++;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if ((u_jlong)((v = v + p) + r) >= (u_jlong)r)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return (jdouble)k;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return logl(a);
|
||
|
#else
|
||
|
return log(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (a < (jdouble)-0.0)
|
||
|
return jcgo_fpNaN;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = logl(a);
|
||
|
#else
|
||
|
a = JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
log(a * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)))) - (DBL_MANT_DIG - 1) * M_LN2 : log(a);
|
||
|
#endif
|
||
|
}
|
||
|
else a = -jcgo_fpInf;
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_sqrt__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__sqrt__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble r;
|
||
|
jdouble t;
|
||
|
jdouble q = (jdouble)0;
|
||
|
jdouble s = (jdouble)0;
|
||
|
int k;
|
||
|
int carry;
|
||
|
if (a <= (jdouble)0)
|
||
|
return (jdouble)0;
|
||
|
r = a;
|
||
|
for (k = 0; r > (jdouble)3; k++)
|
||
|
r = (jdouble)((jlong)r >> 2);
|
||
|
carry = 0;
|
||
|
r = (jdouble)((jlong)1L << (k << 1));
|
||
|
do
|
||
|
{
|
||
|
t = s + r;
|
||
|
if (carry || (u_jlong)t <= (u_jlong)a)
|
||
|
{
|
||
|
q = q + r;
|
||
|
a = a - t;
|
||
|
if (a == (jdouble)0)
|
||
|
break;
|
||
|
carry = 0;
|
||
|
s = t + r;
|
||
|
}
|
||
|
if (a < (jdouble)0)
|
||
|
carry = 1;
|
||
|
a = a + a;
|
||
|
} while ((r = (jdouble)((jlong)r >> 1)) > (jdouble)0);
|
||
|
return (jdouble)((jlong)q >> k);
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return sqrtl(a);
|
||
|
#else
|
||
|
return sqrt(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (a < (jdouble)-0.0)
|
||
|
return jcgo_fpNaN;
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = sqrtl(a);
|
||
|
#else
|
||
|
a = JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
sqrt(a * ((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)))) / (double)(1L << (DBL_MANT_DIG / 2)) :
|
||
|
sqrt(a);
|
||
|
#endif
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_pow__DD
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__pow__DD( jdouble a, jdouble b )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
int sign = 0;
|
||
|
if (b <= (jdouble)0)
|
||
|
{
|
||
|
if (b == (jdouble)0)
|
||
|
return (jdouble)1;
|
||
|
if (a == (jdouble)0)
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
}
|
||
|
if (a < (jdouble)0)
|
||
|
{
|
||
|
a = -a;
|
||
|
if (((int)b & 1) != 0)
|
||
|
sign = 1;
|
||
|
}
|
||
|
v = a;
|
||
|
if ((u_jlong)a > (u_jlong)1L)
|
||
|
{
|
||
|
if (b < (jdouble)0)
|
||
|
return (jdouble)0;
|
||
|
if (b >= (jdouble)(sizeof(jlong) * 8 - 1))
|
||
|
return sign ? (jdouble)((jlong)(~(((u_jlong)-1L) >> 1))) :
|
||
|
(jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
if (a != (jdouble)2)
|
||
|
{
|
||
|
if (((int)b & 1) == 0)
|
||
|
v = (jdouble)1;
|
||
|
while ((b = (jdouble)(((unsigned)b) >> 1)) > (jdouble)0)
|
||
|
{
|
||
|
a = a * a;
|
||
|
if (((int)b & 1) != 0)
|
||
|
v = v * a;
|
||
|
}
|
||
|
}
|
||
|
else v = (jdouble)((jlong)1L << (int)b);
|
||
|
}
|
||
|
if (sign)
|
||
|
v = -v;
|
||
|
return v;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return powl(a, b);
|
||
|
#else
|
||
|
return pow(a, b);
|
||
|
#endif
|
||
|
#else
|
||
|
jdouble v;
|
||
|
jdouble d;
|
||
|
if (JCGO_FP_FINITE(b))
|
||
|
{
|
||
|
if (JCGO_EXPECT_FALSE(b == (jdouble)0.0))
|
||
|
return (jdouble)1.0;
|
||
|
if (JCGO_EXPECT_FALSE(b == (jdouble)1.0))
|
||
|
return a;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
v = (jdouble)0.0;
|
||
|
if (a < (jdouble)0.0)
|
||
|
{
|
||
|
v = b - JCGO_FP_FLOOR(b / (jdouble)2.0) * (jdouble)2.0;
|
||
|
if (JCGO_EXPECT_FALSE(v != (jdouble)0.0 && v != (jdouble)1.0))
|
||
|
return jcgo_fpNaN;
|
||
|
a = -a;
|
||
|
}
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)1.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = (a > (jdouble)1.0 && b < (jdouble)0.0) ||
|
||
|
(a < (jdouble)1.0 && b > (jdouble)0.0) ||
|
||
|
(d = logl(a) * b) <= (jdouble)(LN_MAXLDOUBLE - 0.1) ?
|
||
|
powl(a, b) : d < (jdouble)(LN_MAXLDOUBLE + 0.9) ?
|
||
|
expl(d - (jdouble)1.0) * M_El : jcgo_fpInf;
|
||
|
#else
|
||
|
d = (JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
log(a * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)))) - (DBL_MANT_DIG - 1) * M_LN2 :
|
||
|
log(a)) * b;
|
||
|
a = JCGO_EXPECT_TRUE(d < LN_MAXDOUBLE - 0.1) ?
|
||
|
(JCGO_EXPECT_FALSE(d > -LN_MINDOUBLE - 0.1 &&
|
||
|
d < LN_MINDOUBLE + 0.1) ? (d >= 0.0 ?
|
||
|
exp(d + DBL_MANT_DIG * M_LN2) /
|
||
|
((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2))) : exp(d - DBL_MANT_DIG * M_LN2) *
|
||
|
((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2)))) :
|
||
|
JCGO_EXPECT_FALSE(a < DBL_MIN) ? exp(d) : pow(a, b)) :
|
||
|
d < LN_MAXDOUBLE + 0.9 ? exp(d - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
}
|
||
|
if (v != (jdouble)0.0)
|
||
|
a = -a;
|
||
|
return a;
|
||
|
}
|
||
|
if (JCGO_FP_ZEROISNEG(a))
|
||
|
a = b - JCGO_FP_FLOOR(b / (jdouble)2.0) * (jdouble)2.0;
|
||
|
b = b < (jdouble)0.0 ? jcgo_fpInf : (jdouble)0.0;
|
||
|
if (a == (jdouble)1.0)
|
||
|
b = -b;
|
||
|
return b;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a))
|
||
|
{
|
||
|
if (a < (jdouble)0.0)
|
||
|
{
|
||
|
a = -a;
|
||
|
if (b < (jdouble)0.0)
|
||
|
a = (jdouble)0.0;
|
||
|
if (b - JCGO_FP_FLOOR(b / (jdouble)2.0) * (jdouble)2.0 == (jdouble)1.0)
|
||
|
a = -a;
|
||
|
}
|
||
|
else if (b < (jdouble)0.0)
|
||
|
a = (jdouble)0.0;
|
||
|
}
|
||
|
return a;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(b))
|
||
|
{
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (a < (jdouble)0.0)
|
||
|
a = -a;
|
||
|
if (a != (jdouble)1.0)
|
||
|
{
|
||
|
if (a < (jdouble)1.0)
|
||
|
b = -b;
|
||
|
if (b < (jdouble)0.0)
|
||
|
b = (jdouble)0.0;
|
||
|
return b;
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a))
|
||
|
{
|
||
|
if (a < (jdouble)0.0)
|
||
|
a = -a;
|
||
|
if (b < (jdouble)0.0)
|
||
|
a = (jdouble)0.0;
|
||
|
}
|
||
|
return a;
|
||
|
}
|
||
|
return b;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_IEEEremainder__DD
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__IEEEremainder__DD( jdouble x, jdouble y )
|
||
|
{
|
||
|
jdouble v;
|
||
|
jdouble d;
|
||
|
#ifdef JCGO_NOFP
|
||
|
if (y == (jdouble)0)
|
||
|
return (jdouble)0;
|
||
|
d = x;
|
||
|
if (x < (jdouble)0)
|
||
|
x = -x;
|
||
|
if (y < (jdouble)0)
|
||
|
y = -y;
|
||
|
if ((((u_jlong)x) >> 1) >= (u_jlong)y)
|
||
|
x = (jdouble)((u_jlong)x % (u_jlong)(y + y));
|
||
|
v = x - y;
|
||
|
if (v >= (jdouble)0)
|
||
|
{
|
||
|
y = y - v;
|
||
|
x = v;
|
||
|
if ((u_jlong)y <= (u_jlong)v)
|
||
|
x = -y;
|
||
|
}
|
||
|
else if (-x < v)
|
||
|
x = v;
|
||
|
if (d < (jdouble)0)
|
||
|
x = -x;
|
||
|
return x;
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(y != (jdouble)0.0) && JCGO_FP_FINITE(x))
|
||
|
{
|
||
|
if (JCGO_FP_FINITE(y))
|
||
|
{
|
||
|
d = x;
|
||
|
if (x < (jdouble)0.0)
|
||
|
x = -x;
|
||
|
if (y < (jdouble)0.0)
|
||
|
y = -y;
|
||
|
if (x / (jdouble)2.0 >= y)
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
x = fmodl(x, y * (jdouble)2.0);
|
||
|
#else
|
||
|
x = JCGO_EXPECT_FALSE(x < DBL_MIN) ||
|
||
|
(JCGO_EXPECT_FALSE(y <= DBL_MIN / 2.0) && x <= 1.0) ?
|
||
|
fmod(x * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2))),
|
||
|
y * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)) * 2.0)) /
|
||
|
((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2))) : fmod(x, y * 2.0);
|
||
|
#endif
|
||
|
}
|
||
|
v = x - y;
|
||
|
if (v >= (jdouble)0.0)
|
||
|
{
|
||
|
y = y - v;
|
||
|
x = v;
|
||
|
if (y <= v)
|
||
|
x = -y;
|
||
|
}
|
||
|
else if (-v < x)
|
||
|
x = v;
|
||
|
if (d < (jdouble)0.0)
|
||
|
x = -x;
|
||
|
return x;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(y))
|
||
|
return x;
|
||
|
}
|
||
|
return jcgo_fpNaN;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_ceil__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__ceil__D( jdouble a )
|
||
|
{
|
||
|
#ifndef JCGO_NOFP
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
a = -JCGO_FP_FLOOR(-a);
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_floor__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__floor__D( jdouble a )
|
||
|
{
|
||
|
#ifndef JCGO_NOFP
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
a = JCGO_FP_FLOOR(a);
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_rint__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__rint__D( jdouble a )
|
||
|
{
|
||
|
#ifndef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
v = a;
|
||
|
a = JCGO_FP_FLOOR(((jdouble)0.5 + a) / (jdouble)2.0) * (jdouble)2.0;
|
||
|
if (v - a > (jdouble)0.5)
|
||
|
a = a + (jdouble)1.0;
|
||
|
else if (JCGO_EXPECT_FALSE(v < (jdouble)0.0 && v >= (jdouble)-0.5))
|
||
|
a = -a;
|
||
|
}
|
||
|
#endif
|
||
|
return a;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_cbrt__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__cbrt__D( jdouble a )
|
||
|
{
|
||
|
int sign;
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble s;
|
||
|
jdouble t;
|
||
|
int j;
|
||
|
if (a == (jdouble)0)
|
||
|
return (jdouble)0;
|
||
|
sign = 0;
|
||
|
if (a < (jdouble)0)
|
||
|
{
|
||
|
a = -a;
|
||
|
sign = 1;
|
||
|
}
|
||
|
v = (jdouble)((jlong)a >> ((int)sizeof(jlong) * 8 - 12));
|
||
|
if (v > (jdouble)0)
|
||
|
{
|
||
|
j = 0;
|
||
|
do
|
||
|
{
|
||
|
j++;
|
||
|
} while ((v = (jdouble)((jlong)v >> 1)) > (jdouble)0);
|
||
|
a = (jdouble)((u_jlong)(((jlong)1L << j) - (jlong)1L) | (u_jlong)a) +
|
||
|
(jdouble)1;
|
||
|
}
|
||
|
s = a;
|
||
|
v = (jdouble)1;
|
||
|
while ((u_jlong)s >= (u_jlong)8L)
|
||
|
{
|
||
|
v = v + v;
|
||
|
s = (jdouble)(((u_jlong)s) >> 3);
|
||
|
}
|
||
|
if (v > (jdouble)1)
|
||
|
{
|
||
|
t = v;
|
||
|
for (;;)
|
||
|
{
|
||
|
s = v * v;
|
||
|
if (s == (jdouble)0)
|
||
|
break;
|
||
|
s = ((jdouble)((u_jlong)a / (u_jlong)s) + (v + v)) / (jdouble)3;
|
||
|
if (s == t || s == v)
|
||
|
break;
|
||
|
t = v;
|
||
|
v = s;
|
||
|
}
|
||
|
if (v >= s)
|
||
|
v = s;
|
||
|
}
|
||
|
return sign ? -v : v;
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)-0.0))
|
||
|
{
|
||
|
sign = 0;
|
||
|
if (a < (jdouble)0.0)
|
||
|
{
|
||
|
sign = 1;
|
||
|
a = -a;
|
||
|
}
|
||
|
#ifdef JCGO_MATHEXT
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = cbrtl(a);
|
||
|
#else
|
||
|
a = JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
cbrt(a * ((double)(1L << ((DBL_MANT_DIG + 1) / 3)) *
|
||
|
(double)(1L << ((DBL_MANT_DIG + 1) / 3)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 3)))) /
|
||
|
(double)(1L << ((DBL_MANT_DIG + 1) / 3)) : cbrt(a);
|
||
|
#endif
|
||
|
#else
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = powl(a, (jdouble)1.0 / (jdouble)3.0);
|
||
|
#else
|
||
|
a = JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
pow(a * ((double)(1L << ((DBL_MANT_DIG + 1) / 3)) *
|
||
|
(double)(1L << ((DBL_MANT_DIG + 1) / 3)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 3))), 1.0 / 3.0) /
|
||
|
(double)(1L << ((DBL_MANT_DIG + 1) / 3)) : pow(a, 1.0 / 3.0);
|
||
|
#endif
|
||
|
#endif
|
||
|
if (sign)
|
||
|
a = -a;
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_hypot__DD
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__hypot__DD( jdouble a, jdouble b )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble r;
|
||
|
jdouble ql;
|
||
|
jdouble qh;
|
||
|
jdouble sl;
|
||
|
jdouble sh;
|
||
|
jdouble vl;
|
||
|
jdouble vh;
|
||
|
int k;
|
||
|
int isbig;
|
||
|
if (a == (jdouble)((jlong)(~(((u_jlong)-1L) >> 1))) ||
|
||
|
b == (jdouble)((jlong)(~(((u_jlong)-1L) >> 1))))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
if (a < (jdouble)0)
|
||
|
a = -a;
|
||
|
if (b < (jdouble)0)
|
||
|
b = -b;
|
||
|
ql = a;
|
||
|
if (b != (jdouble)0)
|
||
|
{
|
||
|
ql = b;
|
||
|
if (a != (jdouble)0)
|
||
|
{
|
||
|
ql = (jdouble)((u_jlong)1L << ((int)sizeof(jlong) * 4)) - (jdouble)1;
|
||
|
vl = (jdouble)((jlong)a & (jlong)ql);
|
||
|
ql = (jdouble)((jlong)b & (jlong)ql);
|
||
|
vh = (jdouble)(((u_jlong)a) >> ((int)sizeof(jlong) * 4));
|
||
|
qh = (jdouble)(((u_jlong)b) >> ((int)sizeof(jlong) * 4));
|
||
|
vh = (jdouble)(((((u_jlong)vl * (u_jlong)vl) >>
|
||
|
((int)sizeof(jlong) * 4 + 1)) +
|
||
|
(u_jlong)vl * (u_jlong)vh) >> ((int)sizeof(jlong) * 4 - 1)) +
|
||
|
vh * vh + qh * qh + (jdouble)(((((u_jlong)ql * (u_jlong)ql) >>
|
||
|
((int)sizeof(jlong) * 4 + 1)) +
|
||
|
(u_jlong)ql * (u_jlong)qh) >> ((int)sizeof(jlong) * 4 - 1));
|
||
|
ql = (jdouble)((u_jlong)b * (u_jlong)b);
|
||
|
vl = (jdouble)((u_jlong)a * (u_jlong)a) + ql;
|
||
|
if ((u_jlong)vl < (u_jlong)ql)
|
||
|
vh++;
|
||
|
if ((u_jlong)vh > (((u_jlong)-1L) >> 2))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
isbig = 0;
|
||
|
r = vl;
|
||
|
if (vh != (jdouble)0)
|
||
|
{
|
||
|
r = vh;
|
||
|
isbig = 1;
|
||
|
}
|
||
|
for (k = 0; r >= (jdouble)3; k++)
|
||
|
r = (jdouble)((jlong)r >> 2);
|
||
|
if (r < (jdouble)0)
|
||
|
{
|
||
|
k = (int)sizeof(jlong) * 4 - 1;
|
||
|
if (r >= (jdouble)((jlong)(~(((u_jlong)-1L) >> 2))))
|
||
|
{
|
||
|
k = 0;
|
||
|
isbig = 1;
|
||
|
}
|
||
|
}
|
||
|
ql = (jdouble)0;
|
||
|
qh = (jdouble)0;
|
||
|
sl = (jdouble)0;
|
||
|
sh = (jdouble)0;
|
||
|
r = (jdouble)((jlong)1L << (k << 1));
|
||
|
if (isbig)
|
||
|
k = k + (int)sizeof(jlong) * 4;
|
||
|
for (;;)
|
||
|
{
|
||
|
if (isbig)
|
||
|
{
|
||
|
a = sl;
|
||
|
b = sh + r;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
a = sl + r;
|
||
|
b = sh;
|
||
|
if ((u_jlong)a < (u_jlong)r)
|
||
|
b++;
|
||
|
}
|
||
|
if ((u_jlong)b < (u_jlong)vh ||
|
||
|
((u_jlong)b == (u_jlong)vh && (u_jlong)a <= (u_jlong)vl))
|
||
|
{
|
||
|
if (isbig)
|
||
|
qh = qh + r;
|
||
|
else
|
||
|
{
|
||
|
ql = ql + r;
|
||
|
if ((u_jlong)ql < (u_jlong)r)
|
||
|
qh++;
|
||
|
}
|
||
|
vh = vh - b;
|
||
|
if ((u_jlong)vl < (u_jlong)a)
|
||
|
vh--;
|
||
|
vl = vl - a;
|
||
|
if (vl == (jdouble)0 && vh == (jdouble)0)
|
||
|
break;
|
||
|
if (isbig)
|
||
|
{
|
||
|
sl = a;
|
||
|
sh = b + r;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sl = a + r;
|
||
|
sh = b;
|
||
|
if ((u_jlong)sl < (u_jlong)r)
|
||
|
sh++;
|
||
|
}
|
||
|
}
|
||
|
vh = vh + vh;
|
||
|
if (vl < (jdouble)0)
|
||
|
vh++;
|
||
|
vl = vl + vl;
|
||
|
r = (jdouble)(((u_jlong)r) >> 1);
|
||
|
if (r == (jdouble)0)
|
||
|
{
|
||
|
if (!isbig)
|
||
|
break;
|
||
|
r = (jdouble)((jlong)(~(((u_jlong)-1L) >> 1)));
|
||
|
isbig = 0;
|
||
|
}
|
||
|
}
|
||
|
if (k > 0)
|
||
|
ql = (jdouble)((jlong)qh << ((int)sizeof(jlong) * 8 - k)) +
|
||
|
(jdouble)(((u_jlong)ql) >> k);
|
||
|
}
|
||
|
}
|
||
|
r = (jdouble)(((u_jlong)ql) >> ((int)sizeof(jlong) * 8 - 11));
|
||
|
if (r > (jdouble)0)
|
||
|
{
|
||
|
k = 0;
|
||
|
do
|
||
|
{
|
||
|
k++;
|
||
|
} while ((r = (jdouble)((jlong)r >> 1)) > (jdouble)0);
|
||
|
r = (jdouble)((jlong)1L << (k - 1));
|
||
|
b = r + r;
|
||
|
if ((jdouble)((u_jlong)((b + b - (jdouble)1) & (u_jlong)ql)) > r)
|
||
|
ql = r + ql;
|
||
|
ql = (jdouble)((u_jlong)(-b) & (u_jlong)ql);
|
||
|
if (ql < (jdouble)0)
|
||
|
ql = (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
}
|
||
|
return ql;
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (a < (jdouble)0.0)
|
||
|
a = -a;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (b < (jdouble)0.0)
|
||
|
b = -b;
|
||
|
v = b;
|
||
|
if (JCGO_FP_FINITE(b))
|
||
|
{
|
||
|
if (a < b)
|
||
|
{
|
||
|
b = a;
|
||
|
a = v;
|
||
|
}
|
||
|
if (a <= (jdouble)0.0)
|
||
|
return (jdouble)0.0;
|
||
|
#ifdef JCGO_FP_HYPOT
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
v = a * M_SQRT2l;
|
||
|
#else
|
||
|
v = a * M_SQRT2;
|
||
|
#endif
|
||
|
if (JCGO_EXPECT_TRUE(a != b))
|
||
|
{
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
{
|
||
|
v = JCGO_FP_HYPOT(a, b);
|
||
|
if (JCGO_FP_FINITE(v) && JCGO_EXPECT_TRUE(v != (jdouble)0.0))
|
||
|
return v;
|
||
|
}
|
||
|
v = JCGO_FP_HYPOT(b / a, (jdouble)1.0) * a;
|
||
|
}
|
||
|
#else
|
||
|
v = b / a;
|
||
|
v = v * v + (jdouble)1.0;
|
||
|
if (JCGO_FP_FINITE(v))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
v = sqrtl(v) * a;
|
||
|
#else
|
||
|
v = sqrt(v) * a;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
return v;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(b))
|
||
|
return a;
|
||
|
return b;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_expm1__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__expm1__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble vf;
|
||
|
jdouble m;
|
||
|
jdouble mf;
|
||
|
jdouble p;
|
||
|
int j = 0;
|
||
|
if (a <= (jdouble)0)
|
||
|
return a == (jdouble)0 ? (jdouble)0 : (jdouble)-1;
|
||
|
if (a > (jdouble)(((u_jint)0x2C5L *
|
||
|
(u_jint)((int)sizeof(jlong) * 8 - 1)) >> 10))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
v = (jdouble)1;
|
||
|
m = (jdouble)1;
|
||
|
vf = (jdouble)0;
|
||
|
mf = (jdouble)0;
|
||
|
for (;;)
|
||
|
{
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 8 - 12)) + a * m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
mf = (jdouble)((((u_jlong)(m - p * j) << ((int)sizeof(jlong) * 8 - 12)) +
|
||
|
((u_jlong)mf & (((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)) -
|
||
|
(u_jlong)1L))) / (u_jlong)j);
|
||
|
m = p;
|
||
|
vf = vf + mf;
|
||
|
v = v + m;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
{
|
||
|
v++;
|
||
|
vf = vf - (jdouble)((jlong)1L << ((int)sizeof(jlong) * 8 - 12));
|
||
|
}
|
||
|
else if (m == (jdouble)0 && (((u_jlong)mf) >> 1) + (u_jlong)vf <=
|
||
|
((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
break;
|
||
|
mf = a * mf;
|
||
|
}
|
||
|
m = (jdouble)(((u_jlong)v) >> ((int)sizeof(jlong) * 8 - 11));
|
||
|
if (m > (jdouble)0)
|
||
|
{
|
||
|
j = 0;
|
||
|
do
|
||
|
{
|
||
|
j++;
|
||
|
} while ((m = (jdouble)((jlong)m >> 1)) > (jdouble)0);
|
||
|
m = (jdouble)((jlong)1L << (j - 1));
|
||
|
p = (m + m) + m;
|
||
|
if ((jdouble)((u_jlong)v & (u_jlong)p) == p)
|
||
|
v = m + v;
|
||
|
v = (jdouble)((u_jlong)(-(m + m)) & (u_jlong)v);
|
||
|
}
|
||
|
return v - (jdouble)1;
|
||
|
#else
|
||
|
jdouble v;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_MATHEXT
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
v = JCGO_EXPECT_TRUE(a < (jdouble)(LN_MAXLDOUBLE - 0.1)) ?
|
||
|
(JCGO_EXPECT_TRUE(a != (jdouble)-0.0) ? expm1l(a) : a) :
|
||
|
a < (jdouble)(LN_MAXLDOUBLE + 0.9) ?
|
||
|
expm1l(a - (jdouble)1.0) * M_El : jcgo_fpInf;
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a < LN_MAXDOUBLE - 0.1))
|
||
|
{
|
||
|
v = expm1(a);
|
||
|
if (JCGO_EXPECT_FALSE(v >= -0.0 && v <= 0.0))
|
||
|
v = a;
|
||
|
}
|
||
|
else v = a < LN_MAXDOUBLE + 0.9 ? expm1(a - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
return v;
|
||
|
#else
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
v = JCGO_EXPECT_TRUE(a < (jdouble)(LN_MAXLDOUBLE - 0.1)) ? expl(a) :
|
||
|
a < (jdouble)(LN_MAXLDOUBLE + 0.9) ? expl(a - (jdouble)1.0) * M_El :
|
||
|
jcgo_fpInf;
|
||
|
#else
|
||
|
v = JCGO_EXPECT_TRUE(a < LN_MAXDOUBLE - 0.1) ?
|
||
|
(JCGO_EXPECT_FALSE(a > -LN_MINDOUBLE - 0.1 && a < LN_MINDOUBLE + 0.1) ?
|
||
|
(a >= 0.0 ? exp(a + DBL_MANT_DIG * M_LN2) /
|
||
|
((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2))) : exp(a - DBL_MANT_DIG * M_LN2) *
|
||
|
((double)(1L << (DBL_MANT_DIG / 2)) *
|
||
|
(1L << ((DBL_MANT_DIG + 1) / 2)))) : exp(a)) :
|
||
|
a < LN_MAXDOUBLE + 0.9 ? exp(a - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
return JCGO_EXPECT_TRUE(v != (jdouble)1.0) ? v - (jdouble)1.0 : a;
|
||
|
#endif
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a) && a < (jdouble)0.0)
|
||
|
a = (jdouble)-1.0;
|
||
|
return a;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_log10__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__log10__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
int k;
|
||
|
if (a == (jdouble)0)
|
||
|
return (jdouble)((jlong)(~(((u_jlong)-1L) >> 1)));
|
||
|
for (k = 0; a >= (jdouble)10; k++)
|
||
|
a = a / (jdouble)10;
|
||
|
return (jdouble)k;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return log10l(a);
|
||
|
#else
|
||
|
return log10(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (a < (jdouble)-0.0)
|
||
|
return jcgo_fpNaN;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)0.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = log10l(a);
|
||
|
#else
|
||
|
a = JCGO_EXPECT_FALSE(a < DBL_MIN) ?
|
||
|
log10(a * ((double)(1L << ((DBL_MANT_DIG - 1) / 2)) *
|
||
|
(1L << (DBL_MANT_DIG / 2)))) - (DBL_MANT_DIG - 1) * M_LN2 / M_LN10 :
|
||
|
log10(a);
|
||
|
#endif
|
||
|
}
|
||
|
else a = -jcgo_fpInf;
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_log1p__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__log1p__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble m;
|
||
|
jdouble p;
|
||
|
jdouble r;
|
||
|
jdouble mf;
|
||
|
jdouble df;
|
||
|
int j;
|
||
|
int k = 0;
|
||
|
if (a == (jdouble)-1)
|
||
|
return (jdouble)((jlong)(~(((u_jlong)-1L) >> 1)));
|
||
|
if (a > (jdouble)0)
|
||
|
{
|
||
|
if ((jlong)a != (jlong)(((u_jlong)-1L) >> 1))
|
||
|
a++;
|
||
|
v = a;
|
||
|
k = (int)sizeof(jlong) * 8 - 2;
|
||
|
while ((a = a + a) >= (jdouble)0)
|
||
|
k--;
|
||
|
if (k >= (int)sizeof(jlong) * 8 - 11)
|
||
|
{
|
||
|
a = (jdouble)(((jlong)v - (jlong)1L) >>
|
||
|
(k - ((int)sizeof(jlong) * 8 - 11)));
|
||
|
if (((int)a & 0x3) != 0x3)
|
||
|
a = a + (jdouble)2;
|
||
|
a = (jdouble)(((jlong)a >> 1) << 11);
|
||
|
}
|
||
|
j = (int)sizeof(jlong) * 8;
|
||
|
r = (jdouble)((((u_jlong)0xB17217F7L) << ((int)sizeof(jlong) * 8 - 32)) |
|
||
|
(j > 32 ? ((u_jlong)0xD1CF79ABL) >> ((32 << 1) - j) : (u_jlong)0L)) *
|
||
|
(jdouble)k;
|
||
|
a = a + a;
|
||
|
k = (int)(((u_jint)k * (u_jint)0x2C5L) >> 10);
|
||
|
j = 1;
|
||
|
v = a;
|
||
|
m = a;
|
||
|
for (;;)
|
||
|
{
|
||
|
df = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) - (jdouble)1;
|
||
|
mf = (jdouble)((jlong)m & (jlong)df);
|
||
|
df = (jdouble)((jlong)a & (jlong)df);
|
||
|
m = (jdouble)(((u_jlong)m) >> ((int)sizeof(jlong) * 4));
|
||
|
p = (jdouble)(((u_jlong)a) >> ((int)sizeof(jlong) * 4));
|
||
|
mf = (jdouble)(((u_jlong)(mf * df)) >> ((int)sizeof(jlong) * 4)) + mf * p;
|
||
|
df = m * df;
|
||
|
mf = df + mf;
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 4)) + m * p;
|
||
|
if ((u_jlong)mf < (u_jlong)df)
|
||
|
m = (jdouble)((jlong)1L << ((int)sizeof(jlong) * 4)) + m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
if ((j & 1) == 0)
|
||
|
{
|
||
|
v = v - p;
|
||
|
if ((u_jlong)(v + r) < (u_jlong)v)
|
||
|
{
|
||
|
k++;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else if ((u_jlong)((v = v + p) + r) >= (u_jlong)r)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return (jdouble)k;
|
||
|
#else
|
||
|
#ifndef JCGO_MATHEXT
|
||
|
jdouble v;
|
||
|
#endif
|
||
|
if (a < (jdouble)-1.0)
|
||
|
return jcgo_fpNaN;
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)-0.0))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)-1.0))
|
||
|
{
|
||
|
#ifdef JCGO_MATHEXT
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = log1pl(a);
|
||
|
#else
|
||
|
if (JCGO_EXPECT_TRUE(a <= -DBL_MIN || a >= DBL_MIN))
|
||
|
a = log1p(a);
|
||
|
#endif
|
||
|
#else
|
||
|
v = a + (jdouble)1.0;
|
||
|
if (JCGO_EXPECT_TRUE(v != (jdouble)1.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = a / (v - (jdouble)1.0) * logl(v);
|
||
|
#else
|
||
|
a = a / (v - 1.0) * log(v);
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
else a = -jcgo_fpInf;
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_sinh__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__sinh__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
int sign;
|
||
|
jdouble v;
|
||
|
jdouble vf;
|
||
|
jdouble m;
|
||
|
jdouble mf;
|
||
|
jdouble p;
|
||
|
int j = 0;
|
||
|
if (a == (jdouble)0)
|
||
|
return (jdouble)0;
|
||
|
if (a > (jdouble)(((u_jint)0x2C5L *
|
||
|
(u_jint)((int)sizeof(jlong) * 8)) >> 10))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
if (a < -(jdouble)(((u_jint)0x2C5L *
|
||
|
(u_jint)((int)sizeof(jlong) * 8)) >> 10))
|
||
|
return (jdouble)((jlong)(~(((u_jlong)-1L) >> 1)));
|
||
|
sign = 0;
|
||
|
if (a < (jdouble)0)
|
||
|
{
|
||
|
sign = 1;
|
||
|
a = -a;
|
||
|
}
|
||
|
vf = (jdouble)((u_jlong)1L << ((int)sizeof(jlong) * 8 - 13));
|
||
|
v = (jdouble)0;
|
||
|
mf = vf;
|
||
|
m = (jdouble)0;
|
||
|
for (;;)
|
||
|
{
|
||
|
mf = a * mf;
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 8 - 12)) + a * m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
mf = (jdouble)((((u_jlong)(m - p * j) << ((int)sizeof(jlong) * 8 - 12)) +
|
||
|
((u_jlong)mf & (((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)) -
|
||
|
(u_jlong)1L))) / (u_jlong)j);
|
||
|
m = p;
|
||
|
vf = vf + mf;
|
||
|
v = v + m;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
{
|
||
|
v++;
|
||
|
vf = vf - (jdouble)((jlong)1L << ((int)sizeof(jlong) * 8 - 12));
|
||
|
}
|
||
|
else if (m == (jdouble)0 && (u_jlong)mf + (u_jlong)vf <=
|
||
|
((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
break;
|
||
|
}
|
||
|
m = (jdouble)(((u_jlong)v) >> ((int)sizeof(jlong) * 8 - 12));
|
||
|
if (m > (jdouble)0)
|
||
|
{
|
||
|
j = 0;
|
||
|
do
|
||
|
{
|
||
|
j++;
|
||
|
} while ((m = (jdouble)((jlong)m >> 1)) > (jdouble)0);
|
||
|
m = (jdouble)((jlong)1L << (j - 1));
|
||
|
p = (m + m) + m;
|
||
|
v = v + v;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 13)))
|
||
|
v++;
|
||
|
if ((jdouble)((u_jlong)v & (u_jlong)p) == p)
|
||
|
v = m + v;
|
||
|
v = (jdouble)(((u_jlong)(-(m + m)) & (u_jlong)v) >> 1);
|
||
|
}
|
||
|
return sign ? -v : v;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return sinhl(a);
|
||
|
#else
|
||
|
return sinh(a);
|
||
|
#endif
|
||
|
#else
|
||
|
int sign;
|
||
|
if (JCGO_FP_FINITE(a) && JCGO_EXPECT_TRUE(a != (jdouble)-0.0))
|
||
|
{
|
||
|
sign = 0;
|
||
|
if (a < (jdouble)0.0)
|
||
|
{
|
||
|
sign = 1;
|
||
|
a = -a;
|
||
|
}
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = JCGO_EXPECT_TRUE(a < (jdouble)(LN_MAXLDOUBLE + M_LN2l - 0.1)) ?
|
||
|
sinhl(a) : a < (jdouble)(LN_MAXLDOUBLE + M_LN2l + 0.9) ?
|
||
|
sinhl(a - (jdouble)1.0) * M_El : jcgo_fpInf;
|
||
|
#else
|
||
|
a = JCGO_EXPECT_TRUE(a < LN_MAXDOUBLE + M_LN2 - 0.1) ? sinh(a) :
|
||
|
a < LN_MAXDOUBLE + M_LN2 + 0.9 ? sinh(a - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
if (sign)
|
||
|
a = -a;
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_cosh__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__cosh__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
jdouble v;
|
||
|
jdouble vf;
|
||
|
jdouble m;
|
||
|
jdouble mf;
|
||
|
jdouble p;
|
||
|
int j = 0;
|
||
|
if (a == (jdouble)0)
|
||
|
return (jdouble)1;
|
||
|
if (a < (jdouble)0)
|
||
|
a = -a;
|
||
|
if ((u_jlong)a > (u_jlong)(((u_jint)0x2C5L *
|
||
|
(u_jint)((int)sizeof(jlong) * 8)) >> 10))
|
||
|
return (jdouble)(jlong)(((u_jlong)-1L) >> 1);
|
||
|
vf = (jdouble)((u_jlong)1L << ((int)sizeof(jlong) * 8 - 13));
|
||
|
v = (jdouble)0;
|
||
|
mf = vf;
|
||
|
m = (jdouble)0;
|
||
|
for (;;)
|
||
|
{
|
||
|
mf = a * mf;
|
||
|
m = (jdouble)(((u_jlong)mf) >> ((int)sizeof(jlong) * 8 - 12)) + a * m;
|
||
|
if (++j <= 0)
|
||
|
break;
|
||
|
p = (jdouble)((u_jlong)m / (u_jlong)j);
|
||
|
mf = (jdouble)((((u_jlong)(m - p * j) << ((int)sizeof(jlong) * 8 - 12)) +
|
||
|
((u_jlong)mf & (((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)) -
|
||
|
(u_jlong)1L))) / (u_jlong)j);
|
||
|
m = p;
|
||
|
vf = vf + mf;
|
||
|
v = v + m;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
{
|
||
|
v++;
|
||
|
vf = vf - (jdouble)((jlong)1L << ((int)sizeof(jlong) * 8 - 12));
|
||
|
}
|
||
|
else if (m == (jdouble)0 && (u_jlong)mf + (u_jlong)vf <=
|
||
|
((u_jlong)1L << ((int)sizeof(jlong) * 8 - 12)))
|
||
|
break;
|
||
|
}
|
||
|
m = (jdouble)(((u_jlong)v) >> ((int)sizeof(jlong) * 8 - 12));
|
||
|
if (m > (jdouble)0)
|
||
|
{
|
||
|
j = 0;
|
||
|
do
|
||
|
{
|
||
|
j++;
|
||
|
} while ((m = (jdouble)((jlong)m >> 1)) > (jdouble)0);
|
||
|
m = (jdouble)((jlong)1L << (j - 1));
|
||
|
p = (m + m) + m;
|
||
|
v = v + v;
|
||
|
if ((u_jlong)vf >= ((u_jlong)1L << ((int)sizeof(jlong) * 8 - 13)))
|
||
|
v++;
|
||
|
if ((jdouble)((u_jlong)v & (u_jlong)p) == p)
|
||
|
v = m + v;
|
||
|
v = (jdouble)(((u_jlong)(-(m + m)) & (u_jlong)v) >> 1);
|
||
|
}
|
||
|
return v;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return coshl(a);
|
||
|
#else
|
||
|
return cosh(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (a < (jdouble)0.0)
|
||
|
a = -a;
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = JCGO_EXPECT_TRUE(a < (jdouble)(LN_MAXLDOUBLE + M_LN2l - 0.1)) ?
|
||
|
coshl(a) : a < (jdouble)(LN_MAXLDOUBLE + M_LN2l + 0.9) ?
|
||
|
coshl(a - (jdouble)1.0) * M_El : jcgo_fpInf;
|
||
|
#else
|
||
|
a = JCGO_EXPECT_TRUE(a < LN_MAXDOUBLE + M_LN2 - 0.1) ? cosh(a) :
|
||
|
a < LN_MAXDOUBLE + M_LN2 + 0.9 ? cosh(a - 1.0) * M_E : jcgo_fpInf;
|
||
|
#endif
|
||
|
}
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifdef JCGO_NATMATH_tanh__D
|
||
|
JCGO_NOSEP_STATIC jdouble CFASTCALL
|
||
|
java_lang_VMMath__tanh__D( jdouble a )
|
||
|
{
|
||
|
#ifdef JCGO_NOFP
|
||
|
return a >= (jdouble)20 ? (jdouble)1 : a <= (jdouble)-20 ?
|
||
|
(jdouble)-1 : (jdouble)0;
|
||
|
#else
|
||
|
#ifdef JCGO_FASTMATH
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
return tanhl(a);
|
||
|
#else
|
||
|
return tanh(a);
|
||
|
#endif
|
||
|
#else
|
||
|
if (JCGO_FP_FINITE(a))
|
||
|
{
|
||
|
if (JCGO_EXPECT_TRUE(a != (jdouble)-0.0))
|
||
|
{
|
||
|
#ifdef JCGO_LONGDBL
|
||
|
a = tanhl(a);
|
||
|
#else
|
||
|
a = tanh(a);
|
||
|
#endif
|
||
|
}
|
||
|
return a;
|
||
|
}
|
||
|
if (JCGO_FP_NOTNAN(a))
|
||
|
a = a > (jdouble)0.0 ? (jdouble)1.0 : (jdouble)-1.0;
|
||
|
return a;
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|