/* @(#)e_acosh.c 1.3 95/01/18 */
/*
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright ( C ) 1993 by Sun Microsystems , Inc . All rights reserved .
*
* Developed at SunSoft , a Sun Microsystems , Inc . business .
* Permission to use , copy , modify , and distribute this
* software is freely granted , provided that this notice
* is preserved .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*
*/
//#include <sys/cdefs.h>
//__FBSDID("$FreeBSD$");
/* __ieee754_acosh(x)
* Method :
* Based on
* acosh ( x ) = log [ x + sqrt ( x * x - 1 ) ]
* we have
* acosh ( x ) : = log ( x ) + ln2 , if x is large ; else
* acosh ( x ) : = log ( 2 x - 1 / ( sqrt ( x * x - 1 ) + x ) ) if x > 2 ; else
* acosh ( x ) : = log1p ( t + sqrt ( 2 . 0 * t + t * t ) ) ; where t = x - 1 .
*
* Special cases :
* acosh ( x ) is NaN with signal if x < 1 .
* acosh ( NaN ) is NaN without signal .
*/
#include <float .h>
#include <math.h>
#include "math_private.h"
static const double
one = 1 .0 ,
ln2 = 6 .93147180559945286227 e-01 ; /* 0x3FE62E42, 0xFEFA39EF */
double
__ieee754_acosh(double x)
{
double t;
int32_t hx;
u_int32_t lx;
EXTRACT_WORDS(hx,lx,x);
if (hx<0 x3ff00000) { /* x < 1 */
return (x-x)/(x-x);
} else if (hx >=0 x41b00000) { /* x > 2**28 */
if (hx >=0 x7ff00000) { /* x is inf of NaN */
return x+x;
} else
return __ieee754_log(x)+ln2; /* acosh(huge)=log(2x) */
} else if (((hx-0 x3ff00000)|lx)==0 ) {
return 0 .0 ; /* acosh(1) = 0 */
} else if (hx > 0 x40000000) { /* 2**28 > x > 2 */
t=x*x;
return __ieee754_log(2 .0 *x-one/(x+sqrt(t-one)));
} else { /* 1<x<2 */
t = x-one;
return log1p(t+sqrt(2 .0 *t+t*t));
}
}
Messung V0.5 in Prozent C=92 H=97 G=94
¤ Dauer der Verarbeitung: 0.4 Sekunden
¤
*© Formatika GbR, Deutschland