예제 #1
0
double
cos(double x)
{
	double y;

#if	defined(__IEEE_FP__)
	if (_isNaN(x)) {
		errno = EDOM;
		return x;		/* NaN: domain error, return NaN */
	} else if (_isInfinity(x)) {
		errno = EDOM;
		return 1.0;		/* [+-]Infinity: domain error, return 1.0 */
	}
#endif	/* defined(__IEEE_FP__) */

	if (x < -PI || x > PI) {
		x = fmod(x, TWOPI);
		if (x > PI)
			x = x - TWOPI;
		 else if (x < -PI)
			x = x + TWOPI;
	}
	if (x > HALFPI)
		return -(cos(x - PI));
	else if (x < -HALFPI)
		return -(cos(x + PI));
	else if (x > FOURTHPI)
		return sin(HALFPI - x);
	else if (x < -FOURTHPI)
		return sin(HALFPI + x);
	else if (x < COS_MIN && x > -COS_MIN)
		return sqrt(1.0 - (x * x));
	y = x / FOURTHPI;
	return _poly(ORDERP, P, y * y) / _poly(ORDERQ, Q, y * y);
}
예제 #2
0
// -------------------------------------
FLOAT typeJ::absMV_C( FLOAT tempC ) {
  if( !inrange_C( tempC ) )
    return TC_RANGE_ERR;
  if( ( tempC >= pgm_read_float_near( &range_dir[0][0] ) ) &&
      ( tempC <= pgm_read_float_near( &range_dir[1][0] ) ) )
    return _poly( tempC, &(coeff_dir[0][0]), 9, 2 );
  else
    return _poly( tempC, &(coeff_dir[0][1]), 9, 2 );
};
예제 #3
0
// ---------------- returns mV corresponding to temp reading
//                  used for cold junction compensation
FLOAT typeK::absMV_C( FLOAT tempC ) {
  FLOAT sum;
  if( !inrange_C( tempC ) )
    return TC_RANGE_ERR;
  if( ( tempC >= pgm_read_float_near( &range_dir[0][0] ) ) &&
      ( tempC <= pgm_read_float_near( &range_dir[1][0] ) ) )
      return _poly( tempC, &(coeff_dir[0][0]), 11, 2 );
  else {
    sum = _poly( tempC, &(coeff_dir[0][1]), 11, 2 );
    return sum + pgm_read_float_near( &a[0] ) *
        exp( pgm_read_float_near( &a[1] ) *
        ( tempC - pgm_read_float_near( &a[2] ) ) *
        ( tempC - pgm_read_float_near( &a[2] ) ) );
  }
}
예제 #4
0
파일: math.c 프로젝트: DeforaOS/libc
/* private */
static double _logfact(long double x)
{
	static unsigned char list [] = { 6, 4, 3, 3, 2, 2 };
	long double   z = 2. * M_PI * x;
	register int  e = EXPL (x);

	return (log(x) - 1) * x + 0.5 * log(z) + _poly(1. / (x * x),
			e < 0x4003 ? 10 : (e > 0x4008 ? 1 : list[e - 0x4003]),
			_coeff) / x;
}
예제 #5
0
// -------------------------------------
FLOAT typeJ::absTemp_C( FLOAT mv ) {
  if ( ! inrange_mV( mv ) )
    return TC_RANGE_ERR;
  uint8_t j;
  uint8_t ind = 0;
  // first figure out which range of values
  for( j = 0; j < 3; j++ ) {
    if( ( mv >= pgm_read_float_near( &range_inv[0][j] ) ) &&
        ( mv <= pgm_read_float_near( &range_inv[1][j] ) ) )
      ind = j;
  }
  return _poly( mv, &(coeff_inv[0][ind]), 9, 3 );
}