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); }
// ------------------------------------- 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 ); };
// ---------------- 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] ) ) ); } }
/* 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; }
// ------------------------------------- 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 ); }