Use higher precision arithmetic when calculating the atan2 table
authorMichael Nolan <mtnolan2640@gmail.com>
Fri, 17 Apr 2020 14:44:34 +0000 (10:44 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Fri, 17 Apr 2020 14:44:34 +0000 (10:44 -0400)
setup.py
src/ieee754/cordic/fpsin_cos.py

index 95367ed01906d4179a76e14e7c9ad9594e739871..c5bf5cf02cacb34274123f02f5dbfac9ee440059 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -11,6 +11,7 @@ version = '0.0.1'
 install_requires = [
     'nmutil',
 #    'sfpy',  # XXX temporarily disabled
+    'gmpy2'
 ]
 
 test_requires = [
index c61e6bf2648bfe530855e54fb8ae110e4eb7fb72..3c96cafa952a5ab33452eef2e28c7271c93fbce7 100644 (file)
@@ -8,6 +8,10 @@ import math
 from enum import Enum, unique
 from ieee754.fpcommon.fpbase import FPNumBaseRecord, FPNumDecode
 
+import gmpy2
+from gmpy2 import mpfr
+
+
 
 @unique
 class CordicState(Enum):
@@ -25,8 +29,14 @@ class CordicROM(Elaboratable):
         self.addr = Signal(range(iterations))
         self.data = Signal(range(-M, M-1))
 
-        angles = [int(round(M*math.atan(2**(-i))/(math.pi/2)))
-                  for i in range(self.iterations)]
+        angles = []
+        gmpy2.get_context().precision = 150
+        for i in range(self.iterations):
+            x = mpfr(2) ** -i
+            x = gmpy2.atan(x)
+            x = x/(gmpy2.const_pi()/mpfr(2))
+            x = x * mpfr(M)
+            angles.append(int(round(x)))
 
         self.mem = Memory(width=self.data.width,
                           depth=self.iterations,