MCPcopy Create free account
hub / github.com/EricLengyel/Terathon-Math-Library / Tan

Method Tan

TSMath.cpp:301–344  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

299}
300
301float Terathon::Tan(float x)
302{
303 #ifndef TERATHON_NO_SIMD
304
305 float cosine, sine;
306
307 vec_float b = VecMulScalar(VecAndc(VecLoadScalar(&x), VecFloatGetMinusZero()), VecLoadScalarConstant<0x4222F983>());
308 vec_float i = VecPositiveFloorScalar(b);
309 b = VecMulScalar(VecSubScalar(b, i), VecLoadScalarConstant<0x3CC90FDB>());
310
311 const TrigPair& cossin = GetTrigTable()[VecTruncateConvert(i) & 255];
312 vec_float cosine_alpha = VecLoadScalar(&cossin.x);
313 vec_float sine_alpha = VecLoadScalar(&cossin.y);
314
315 vec_float b2 = VecMulScalar(b, b);
316 vec_float sine_beta = VecNmsubScalar(VecMulScalar(b, b2), VecNmsubScalar(b2, VecLoadScalarConstant<0x3E2AAAAB>(), VecLoadScalarConstant<0x3C088889>()), b);
317 vec_float cosine_beta = VecNmsubScalar(b2, VecNmsub(b2, VecLoadScalarConstant<0x3D2AAAAB>(), VecLoadScalarConstant<0x3F000000>()), VecLoadScalarConstant<0x3F800000>());
318
319 VecStoreX(VecMaddScalar(sine_alpha, cosine_beta, VecMulScalar(cosine_alpha, sine_beta)), &sine);
320 VecStoreX(VecSubScalar(VecMulScalar(cosine_alpha, cosine_beta), VecMulScalar(sine_alpha, sine_beta)), &cosine);
321
322 float result = sine / cosine;
323 return ((x < 0.0F) ? -result : result);
324
325 #else
326
327 float b = Fabs(x) * 40.74366543F; // 256 / tau
328 float i = PositiveFloor(b);
329 b = (b - i) * 0.0245436926F; // tau / 256
330
331 const TrigPair& cossin_alpha = GetTrigTable()[int32(i) & 255];
332
333 float b2 = b * b;
334 float sine_beta = b - b * b2 * (0.1666666667F - b2 * 0.008333333333F);
335 float cosine_beta = 1.0F - b2 * (0.5F - b2 * 0.04166666667F);
336
337 float sine = cossin_alpha.y * cosine_beta + cossin_alpha.x * sine_beta;
338 float cosine = cossin_alpha.x * cosine_beta - cossin_alpha.y * sine_beta;
339
340 float result = sine / cosine;
341 return ((x < 0.0F) ? -result : result);
342
343 #endif
344}
345
346void Terathon::CosSin(float x, float *c, float *s)
347{

Callers

nothing calls this directly

Calls 14

VecMulScalarFunction · 0.85
VecAndcFunction · 0.85
VecLoadScalarFunction · 0.85
VecFloatGetMinusZeroFunction · 0.85
VecPositiveFloorScalarFunction · 0.85
VecSubScalarFunction · 0.85
VecTruncateConvertFunction · 0.85
VecNmsubScalarFunction · 0.85
VecNmsubFunction · 0.85
VecStoreXFunction · 0.85
VecMaddScalarFunction · 0.85
FabsFunction · 0.85

Tested by

no test coverage detected