using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Azimuth.UnitTests { public class HighPrecisionTrigTests : UnitTestSharp.TestFixture { public void Basic_Cosine() { var accum = new RobustAccumulator(); accum.AddHarmonic(2, 2, 0); CheckEqual(2, accum.ComputedSum); } public void Basic_Sine() { var accum = new RobustAccumulator(); accum.AddHarmonic(2, 2, Math.PI / 2); CheckEqual(2, accum.ComputedSum); } public void NumericallyTricky_Cosine_0() { Scalar angle = Math.PI - 3.141592650897981; var accum = new RobustAccumulator(); accum.AddHarmonic(2, 0, angle); accum.Add(-2); // Cosine term: 2 + -7.2458531271372668817222267136721e-18 // Sine term: 8.0754367153879301400862705897261e-9 // Sum: 2 + 8.0754367081420770129490037080039e-9 Check(Scalar.FuzzyEquality(-7.2458531271372668817261952966149e-18, accum.ComputedSum, 1e-24)); } public void NumericallyTricky_Sine_0() { Scalar angle = Math.PI / 2 + 2.6918122384626433832795028841972e-9; var accum = new RobustAccumulator(); // Cosine term: -5.3836244769252867600575137264885e-9 // Sine term: 3 + -1.0868779690705900322637332506558e-17 // Sum: -5.3836244877940664507634140491258e-9 accum.AddHarmonic(0, 2, angle); accum.Add(-2); Check(Scalar.FuzzyEquality(-7.2458531271372668817261952966149e-18, accum.ComputedSum.Value, 1e-24)); } public void NumericallyTricky_Cosine_Pi() { Scalar angle = 3.141592650897981; var accum = new RobustAccumulator(); accum.AddHarmonic(2, 0, angle); accum.Add(2); // Cosine term: 2 + -7.2458531271372668817222267136721e-18 // Sine term: 8.0754367153879301400862705897261e-9 // Sum: 2 + 8.0754367081420770129490037080039e-9 Check(Scalar.FuzzyEquality(7.2458531271372668817261952966149e-18, accum.ComputedSum, 1e-23)); } public void NumericallyTricky_Sine_Pi() { Scalar angle = -Math.PI / 2 - 2.6918122384626433832795028841972e-9; var accum = new RobustAccumulator(); // Cosine term: -5.3836244769252867600575137264885e-9 // Sine term: 3 + -1.0868779690705900322637332506558e-17 // Sum: -5.3836244877940664507634140491258e-9 accum.AddHarmonic(0, 2, angle); accum.Add(2); Check(Scalar.FuzzyEquality(7.2458531271372668817261952966149e-18, accum.ComputedSum.Value, 1e-23)); } public class Scalars : UnitTestSharp.TestFixture { public void Basic_Cosine() { var result = HighPrecisionTrig.AddHarmonic((Scalar)2, (Scalar)2, (Scalar)0); CheckEqual(2, result); } public void Basic_Sine() { var result = HighPrecisionTrig.AddHarmonic((Scalar)2, (Scalar)2, (Scalar)Math.PI / 2.0); CheckEqual(2, result); } public void BasicSinCos() { var result = HighPrecisionTrig.AddHarmonic((Scalar)3, (Scalar)4, (Scalar)Math.PI / 3.0); CheckEqual(4.9641016151, result); } } } }