public void Lib_Sin() { float stepDelta = FPGATrigonometryConstants.TwoPI / Steps; var posError = double.MinValue; var negError = double.MaxValue; var absError = 0d; // able to achieve about this accuracy var eps = 3.7e-6; for (var step = 0; step < Steps; step++) { var rad = step * stepDelta; // calculate sin var taylorSin = FPGATrigonometry.Sin(rad); var calculatedSin = Math.Sin(rad); var sinDelta = taylorSin - calculatedSin; absError = Math.Max(absError, Math.Abs(sinDelta)); posError = Math.Max(sinDelta, posError); negError = Math.Min(sinDelta, negError); Assert.IsTrue(sinDelta < eps, $"Failed for sin({rad})"); } }
public void Sin() { using (var port = new QuokkaPort()) { var rnd = new Random(Environment.TickCount); foreach (var idx in Enumerable.Range(-5000, 10000)) { var value = (float)(idx * rnd.NextDouble() * FPGATrigonometryConstants.TwoPI); port.WriteFloat(value); var expected = FPGATrigonometry.Sin(value); var actualBytes = port.Read(4, true, port.DefaultTimeout); var actual = TestConverters.FloatFromByteArray(actualBytes); Assert.AreEqual(expected, actual, $"Failed for {value}"); } } }
public static async Task Aggregator( FPGA.InputSignal <bool> RXD, FPGA.OutputSignal <bool> TXD ) { Sequential handler = () => { FPU.FPUScopeNoSync(); while (true) { float data = 0; UART.ReadFloat(115200, RXD, out data); data = FPGATrigonometry.Sin(data); UART.WriteFloat(115200, data, TXD); } }; FPGA.Config.OnStartup(handler); }