Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/taskcluster/kinds/beetmover-source/   (Linux Kernel Version 6.17.9©) image not shown  

SSL qfresf.c  Sprache: unbekannt

 
/* qfresnl
 *
 * Fresnel integral
 *
 *
 *
 * SYNOPSIS:
 *
 * int qfresnl( x, s, c );
 * QELT *x, *s, *c;
 *
 * qfresnl( x, s, c );
 *
 *
 * DESCRIPTION:
 *
 * Evaluates the Fresnel integrals
 *
 *           x
 *           -
 *          | |
 * C(x) =   |   cos(pi/2 t**2) dt,
 *        | |
 *         -
 *          0
 *
 *           x
 *           -
 *          | |
 * S(x) =   |   sin(pi/2 t**2) dt.
 *        | |
 *         -
 *          0
 *
 *
 * The integrals are evaluated by a power series for x < 1.
 * For large x auxiliary functions f(x) and g(x) are employed
 * such that
 *
 * C(x) = 0.5 + f(x) sin( pi/2 x**2 ) - g(x) cos( pi/2 x**2 )
 * S(x) = 0.5 - f(x) cos( pi/2 x**2 ) - g(x) sin( pi/2 x**2 )
 *
 * Routine qfresfg computes f and g.
 *
 *
 * ACCURACY:
 *
 * Series expansions are truncated at less than full working precision.
 */


/*
Cephes Math Library Release 2.1:  January, 1989
Copyright 1984, 1987, 1989 by Stephen L. Moshier
*/


#include <stdio.h>
#include "qhead.h"

/* asymptotic expansion converges to 144 bits at BRKPT >= 8.2 */
#if NBITS > 144
#define BRKPT 8.2
#else
#define BRKPT 5.7
#endif
extern QELT qpi[], qone[], qtwo[];

static union
  {
    unsigned short s[4];
    double d;
  } dtemp;

static QELT x2[NQ];
static QELT c[NQ];
static QELT q[NQ];
static QELT d[NQ];
static QELT t[NQ];
static QELT x4[NQ];
static QELT x3[NQ];
static QELT t1[NQ];
static QELT cc0[NQ];
static QELT ss0[NQ];
static QELT f[NQ];
static QELT g[NQ];

#ifdef ANSIPROT
int qfresfg( QELT *, QELT *, QELT * );
#else
int qfresfg();
#endif

int qfresnl( x, ss, cc )
QELT x[], ss[], cc[];
{
QELT max;
int sign, i, iconv, ic2;
long il;

qtoe( x, dtemp.s );
if( dtemp.d > BRKPT ) /* 7.0 5.7 */
 goto asymp0;

max = 0;
qmul( x, x, x2 );
qmul( x, x2, x3 ); /* x3 = x**3 */
qmul( x2, x2, x4 ); /* x4 = x**4 */
sign = -1;
qmov( qone, c ); /* c=1 */
qmov( qpi, q );
q[1] -= 1;
qmul( q, x3, x3 ); /* x3 = pi/2 * x**3 */
qmul( q, q, q ); /* q = (pi/2)**2 */

qmov( qone, t );
qmov( qone, cc0 );
qmov( qone, ss0 );
il = 3;
ltoq( &il, d );
qdiv( d, ss0, ss0 ); /* ss = pi/2 * x**3 / 3 */
i = 1;
do
 {
 qadd( c, qone, c ); /* c += 1 */
 qdiv( c, t, t ); /* t /= c */
 qmul( q, t, t ); /* t *= (pi/2)**2 */
 qmul( t, x4, t ); /* t *= x**4 */
 il = 4*i + 1;
 ltoq( &il, d );
 qmov( t, f );
 qdiv( d, f, f );
 if( f[1] > max )
  max = f[1];
 if( sign < 0 )
  qsub( f, cc0, cc0 );
 else
  qadd( cc0, f, cc0 );
 iconv = cc0[1] - f[1];
 qadd( c, qone, c );
 qdiv( c, t, t );
 qmov( t, f );
 il = 4*i + 3;
 ltoq( &il, d );
 qdiv( d, f, f );
 if( sign < 0 )
  qsub( f, ss0, ss0 );
 else
  qadd( ss0, f, ss0 );
 if( f[1] > max )
  max = f[1];
 ic2 = (int) ss0[1] - (int) f[1];
 if( ic2 < iconv )
  iconv = ic2;
 sign = -sign;
 ++i;
 }
while( iconv < 144 );

max = NBITS - max;
if( ss0[1] < cc0[1] )
 max += ss0[1];
else
 max += cc0[1];
if( max < (QELT) (3*NBITS/7) )
 printf( "qfresf: prec %d bits\n", max );

qmul( x, cc0, cc );  /* C(x) */
qmul( x3, ss0, ss );  /* S(x) */
goto done;


asymp0:

qfresfg( x, f, g );

qmov( qpi, t );  /* t = PIO2 * x * x; */
t[1] -= 1;
qmul( x, t, t );
qmul( x, t, t );
qcos( t, c );  /* c = cos(t); */
qsin( t, t );  /* t = sin(t); */
qmov( qone, cc ); /* cc = 0.5  +  f * t  -  g * c; */
cc[1] -= 1;
qmul( f, t, x3 );
qadd( x3, cc, cc );
qmul( g, c, x3 );
qsub( x3, cc, cc );

qmov( qone, ss ); /* ss = 0.5  -  f * c  -  g * t; */
ss[1] -= 1;
qmul( f, c, x3 );
qsub( x3, ss, ss );
qmul( g, t, x3 );
qsub( x3, ss, ss );

done:

if( x[0] != 0 )
 {
 cc[0] = -1;
 ss[0] = -1;
 }

return(0);
}


/* the auxiliary functions */
static QELT lss[NQ] = {0};
static QELT lcc[NQ] = {0};

int qfresfg( x, f, g )
QELT x[], f[], g[];
{
int sign, max;
#define co c
#define si q

qtoe( x, dtemp.s );
if( dtemp.d <= BRKPT )
 goto nasymp;


/* Asymptotic power series auxiliary functions
 *  for large argument
 */


qmov( qone, c ); /*  c = 1.0; */
qmov( qone, t ); /* t = 1.0; */
qadd( qone, qone, t1 ); /* t1 = 2.0; */
qmul( qpi, x, q ); /* q = PIO2 * 2.0 * x; */
qmul( q, x, x3 ); /* x3 = nn * x; */
qmul( x3, x3, x4 ); /* x4 = x3 * x3; */
sign = -1;
qmov( qone, f ); /* f = 1.0; */
qmov( qone, g ); /* g = 1.0; */

/*
if( dtemp.d > 20000.0 )
  goto done5;
*/


while( ((int) qone[1] - (int) t[1]) < NBITS/2 )
{
qadd( qtwo, c, c ); /* c += 2.0; */
qmul( t, c, t ); /* t *= c / x4; */
qdiv( x4, t, t );
if( sign < 0 )
 qsub( t, f, f ); /* f -= t; */
else
 qadd( t, f, f ); /* f += t; */
qadd( qtwo, c, c ); /* c += 2.0; */
qmul( t, c, t ); /* t *= c; */
/*
 qtoe( t, dtemp.s );
 printf( "%.4E\n", dtemp.d );
*/

if( t[1] > t1[1] )
 {
 max = qone[1] - t1[1];
 if( max < 3*NBITS/7 )
  printf( "qfres asymp prec %d bits\n", max );
 goto done5;
 }
qmov( t, t1 );  /* t1 = t; */
if( sign < 0 )
 qsub( t, g, g ); /* g -= t; */
else
 qadd( t, g, g ); /* g += t; */
sign = -sign;
}


done5:
qmul( x3, q, d ); /* g /= x3 * q; */
qdiv( d, g, g );
qdiv( q, f, f ); /* f /= q; */
return 0;





nasymp:

qfresnl( x, lss, lcc );
qmov( qone, co );
co[1] -= 1;
qsub( lcc, co, lcc );
qsub( lss, co, lss );

qmul( qpi, x2, x2 );
x2[1] -= 1;
qcos( x2, co );
qsin( x2, si );

  /* f = (.5-ss)*cos - (.5-cc)*sin */

qmul( lss, co, f );
qmul( lcc, si, t );
qsub( t, f, f );

  /* g = (.5-cc)*cos + (.5-ss)*sin */
qmul( lcc, co, g );
qmul( lss, si, t );
qadd( t, g, g );
return 0;
}


Messung V0.5 in Prozent
C=86 H=77 G=81

[Verzeichnis aufwärts0.15unsichere VerbindungÜbersetzung europäischer Sprachen durch Browser2026-09-29]