#define Tangent 1
#define tanf Tangent
#if Name == Tangent
#define Function Tangent
#else
#error "Unknown function."
#endif
#undef tanf
#define ExponentFold 1
#include <math.h>
#define SignificandBits 24
#define ExponentBits 8
float Name(float x)
{
if (isnan(x))
return x;
#if defined __STDC__ && 199901L <= __STDC_VERSION__ && !defined __GNUC__
#pragma STDC FP_CONTRACT OFF
#endif
typedef struct { double m0, m1; } Double2;
static const Double2 ReductionTable[] =
{
{ 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.45f306ep-1, -0x1.b1bbead603d8bp-32 }, { 0x1.17cc1b7p-3, 0x1.391054a7f09d6p-34 }, { 0x1.7cc1b72p-7, 0x1.c882a53f84ebp-37 }, { 0x1.7cc1b72p-7, 0x1.c882a53f84ebp-37 }, { 0x1.f306dcap-9, -0x1.bbead603d8a83p-40 }, { -0x1.9f246c7p-14, 0x1.054a7f09d5f48p-46 }, { -0x1.9f246c7p-14, 0x1.054a7f09d5f48p-46 }, { 0x1.836e4e4p-16, 0x1.054a7f09d5f48p-46 }, { -0x1.f246c6fp-18, 0x1.529fc2757d1f5p-52 }, { 0x1.b727221p-23, -0x1.5ac07b1505c16p-53 }, { 0x1.b727221p-23, -0x1.5ac07b1505c16p-53 }, { 0x1.b727221p-23, -0x1.5ac07b1505c16p-53 }, { -0x1.236377dp-25, -0x1.6b01ec5417056p-55 }, { -0x1.1b1bbebp-28, 0x1.4fe13abe8fa9ap-59 }, { 0x1.c9c882ap-29, 0x1.4fe13abe8fa9ap-59 }, { -0x1.b1bbeadp-32, -0x1.80f62a0b82b2dp-62 }, { 0x1.391054ap-34, 0x1.fc2757d1f534ep-64 }, { -0x1.8ddf56bp-35, -0x1.ec54170565912p-71 }, { 0x1.c882a54p-37, -0x1.ec54170565912p-71 }, { -0x1.bbead6p-40, -0x1.ec54170565912p-71 }, { 0x1.1054a7fp-42, 0x1.3abe8fa9a6eep-75 }, { -0x1.df56b02p-43, 0x1.3abe8fa9a6eep-75 }, { 0x1.054a7f1p-46, -0x1.8a82e0acb223fp-76 }, { -0x1.f56b01fp-47, 0x1.d5f47d4d37703p-78 }, { 0x1.529fc27p-52, 0x1.5f47d4d377037p-82 }, { 0x1.529fc27p-52, 0x1.5f47d4d377037p-82 }, { -0x1.5ac07b1p-53, -0x1.4170565911f92p-83 }, { -0x1.6b01ec5p-55, -0x1.05c1596447e49p-85 }, { -0x1.ac07b15p-57, -0x1.70565911f924fp-91 }, { 0x1.4fe13acp-59, -0x1.70565911f924fp-91 }, { 0x1.3f84ebp-61, -0x1.70565911f924fp-91 }, { 0x1.fc2757dp-64, 0x1.f534ddc0db629p-96 }, { -0x1.ec5417p-71, -0x1.596447e493ad5p-101 }, { -0x1.ec5417p-71, -0x1.596447e493ad5p-101 }, { -0x1.ec5417p-71, -0x1.596447e493ad5p-101 }, { -0x1.ec5417p-71, -0x1.596447e493ad5p-101 }, { 0x1.3abe8fbp-75, -0x1.96447e493ad4dp-105 }, { 0x1.3abe8fbp-75, -0x1.96447e493ad4dp-105 }, { 0x1.d5f47d5p-78, -0x1.6447e493ad4cep-109 }, { -0x1.505c159p-81, -0x1.911f924eb5336p-111 }, { -0x1.505c159p-81, -0x1.911f924eb5336p-111 }, { -0x1.4170566p-83, 0x1.bb81b6c52b328p-113 }, { -0x1.05c1596p-85, -0x1.11f924eb53362p-115 }, { -0x1.7056591p-91, -0x1.f924eb53361dep-123 }, { -0x1.7056591p-91, -0x1.f924eb53361dep-123 }, { -0x1.7056591p-91, -0x1.f924eb53361dep-123 }, { -0x1.c159644p-93, -0x1.f924eb53361dep-123 }, { 0x1.f534ddcp-96, 0x1.b6c52b3278872p-129 }, { -0x1.596447ep-101, -0x1.24eb53361de38p-131 }, { -0x1.596447ep-101, -0x1.24eb53361de38p-131 }, { -0x1.596447ep-101, -0x1.24eb53361de38p-131 }, { -0x1.65911f9p-103, -0x1.275a99b0ef1bfp-134 }, { -0x1.96447e5p-105, 0x1.b14acc9e21c82p-135 }, };
typedef union
{
float f;
struct
{
#if defined __BIG_ENDIAN__
unsigned int sign : 1;
unsigned int exponent : ExponentBits;
unsigned int fraction : SignificandBits-1;
#else unsigned int fraction : SignificandBits-1;
unsigned int exponent : ExponentBits;
unsigned int sign : 1;
#endif } s;
} Float;
Float X = { x };
Double2 residue = ReductionTable[X.s.exponent >> ExponentFold];
double p = x * residue.m0;
int ki = (int) lrint(p);
double k = ki;
double f0 = p - k;
double f1 = x * residue.m1;
double xr = f0 + f1;
double x2 = xr*xr;
double t =
( ((x2 - 0.34431297545117363561) * x2 + 0.75337415977492632831)
* ((x2 + 0.91301179133375347365) * x2 + 0.58807104225499649417)
)
*
( ((x2 - 1.53503935362160698123) * x2 + 0.92783629599735333058)
* (( + 5.27860261872543679865) * x2 + 3.82127246397188494330)
)
*
xr;
return (float) (ki & 1 ? -1/t : t);
}