public void SinCosの戻り値はSinとCosと一致() { void assert(T theta) { var s1 = Table.Sin(theta); var c1 = Table.Cos(theta); var(s2, c2) = Table.SinCos(theta); Assert.Equal(s1, s2); Assert.Equal(c1, c2); } var r = new Random(); for (int i = 0; i < 1000; i++) { var theta = r.NextDouble() * 1000 - 500; assert(theta); } foreach (var theta in _cornerCase) { assert(theta); } }
public void SinCosからAtan2で元のAngleを復元() { void assert(Table.Angle angle) { var s1 = Table.Sin(angle); var c1 = Table.Cos(angle); var atan = Table.Atan2(s1, c1); var a1 = Table.Angle.FromRadian(atan); Assert.Equal(angle, a1); } for (int i = 0; i < 256; i++) { assert(new Table.Angle((byte)i)); } }
public void Angleでの値は15桁精度で取れる() { void assert(Table.Angle angle) { var s1 = Table.Sin(angle); var c1 = Table.Cos(angle); var theta = angle.ToRadian(); var s2 = M.Sin(theta); var c2 = M.Cos(theta); Assert.True(M.Abs(s1 - s2) < 1e-15); Assert.True(M.Abs(c1 - c2) < 1e-15); } for (int i = 0; i < 256; i++) { assert(new Table.Angle((byte)i)); } }
public void 精度が悪いところでも誤差2パーセント程度の精度で取れる() { void assert(T theta) { var s1 = Table.Sin(theta); var c1 = Table.Cos(theta); var s2 = M.Sin(theta); var c2 = M.Cos(theta); Assert.True(M.Abs(s1 - s2) < 1.3e-2); Assert.True(M.Abs(c1 - c2) < 1.3e-2); } for (int i = -256; i <= 256; i++) { var theta = 2 * M.PI / 256 * (i + 0.5); assert(theta); } foreach (var theta in _cornerCase) { assert(theta); } }
public void テーブル上にある値は15桁精度で取れる() { void assert(T theta) { var s1 = Table.Sin(theta); var c1 = Table.Cos(theta); var s2 = M.Sin(theta); var c2 = M.Cos(theta); Assert.True(M.Abs(s1 - s2) < 1e-15); Assert.True(M.Abs(c1 - c2) < 1e-15); } for (int i = -256; i <= 256; i++) { var theta = 2 * M.PI / 256 * i; assert(theta); } foreach (var theta in _cornerCase) { assert(theta); } }