/*
* Copyright ( c ) 1998 , 2001 , 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 . Oracle designates this
* particular file as subject to the " Classpath " exception as provided
* by Oracle in the LICENSE file that accompanied this code .
*
* 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 .
*/
/*
* _ _ kernel_cos ( x , y )
* kernel cos function on [ - pi / 4 , pi / 4 ] , pi / 4 ~ 0 . 785398164
* Input x is assumed to be bounded by ~ pi / 4 in magnitude .
* Input y is the tail of x .
*
* Algorithm
* 1 . Since cos ( - x ) = cos ( x ) , we need only to consider positive x .
* 2 . if x < 2 ^ - 27 ( hx < 0 x3e400000 0 ) , return 1 with inexact if x ! = 0 .
* 3 . cos ( x ) is approximated by a polynomial of degree 14 on
* [ 0 , pi / 4 ]
* 4 14
* cos ( x ) ~ 1 - x * x / 2 + C1 * x + . . . + C6 * x
* where the remez error is
*
* | 2 4 6 8 10 12 14 | - 58
* | cos ( x ) - ( 1 - . 5 * x + C1 * x + C2 * x + C3 * x + C4 * x + C5 * x + C6 * x ) | < = 2
* | |
*
* 4 6 8 10 12 14
* 4 . let r = C1 * x + C2 * x + C3 * x + C4 * x + C5 * x + C6 * x , then
* cos ( x ) = 1 - x * x / 2 + r
* since cos ( x + y ) ~ cos ( x ) - sin ( x ) * y
* ~ cos ( x ) - x * y ,
* a correction term is necessary in cos ( x ) and hence
* cos ( x + y ) = 1 - ( x * x / 2 - ( r - x * y ) )
* For better accuracy when x > 0 . 3 , let qx = | x | / 4 with
* the last 32 bits mask off , and if x > 0 . 78125 , let qx = 0 . 28125 .
* Then
* cos ( x + y ) = ( 1 - qx ) - ( ( x * x / 2 - qx ) - ( r - x * y ) ) .
* Note that 1 - qx and ( x * x / 2 - qx ) is EXACT here , and the
* magnitude of the latter is at least a quarter of x * x / 2 ,
* thus , reducing the rounding error in the subtraction .
*/
#include "fdlibm.h"
#ifdef __STDC__
static const double
#else
static double
#endif
one = 1 .00000000000000000000 e+00 , /* 0x3FF00000, 0x00000000 */
C1 = 4 .16666666666666019037 e-02 , /* 0x3FA55555, 0x5555554C */
C2 = -1 .38888888888741095749 e-03 , /* 0xBF56C16C, 0x16C15177 */
C3 = 2 .48015872894767294178 e-05 , /* 0x3EFA01A0, 0x19CB1590 */
C4 = -2 .75573143513906633035 e-07 , /* 0xBE927E4F, 0x809C52AD */
C5 = 2 .08757232129817482790 e-09 , /* 0x3E21EE9E, 0xBDB4B1C4 */
C6 = -1 .13596475577881948265 e-11 ; /* 0xBDA8FAE9, 0xBE8838D4 */
#ifdef __STDC__
double __kernel_cos(double x, double y)
#else
double __kernel_cos(x, y)
double x,y;
#endif
{
double a,hz,z,r,qx;
int ix;
ix = __HI(x)&0 x7fffffff; /* ix = |x|'s high word*/
if (ix<0 x3e400000) { /* if x < 2**27 */
if (((int )x)==0 ) return one; /* generate inexact */
}
z = x*x;
r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
if (ix < 0 x3FD33333) /* if |x| < 0.3 */
return one - (0 .5 *z - (z*r - x*y));
else {
if (ix > 0 x3fe90000) { /* x > 0.78125 */
qx = 0 .28125 ;
} else {
__HI(qx) = ix-0 x00200000; /* x/4 */
__LO(qx) = 0 ;
}
hz = 0 .5 *z-qx;
a = one-qx;
return a - (hz - (z*r-x*y));
}
}
Messung V0.5 in Prozent C=86 H=100 G=93
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-10-01)
¤
*© Formatika GbR, Deutschland