X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fieee754%2Fcordic%2Ffpsin_cos.py;h=3c96cafa952a5ab33452eef2e28c7271c93fbce7;hb=7aea44d471226db693ee99fd272504248d57375b;hp=c61e6bf2648bfe530855e54fb8ae110e4eb7fb72;hpb=39dab2a91f22458a221da5cd83480552844cfa54;p=ieee754fpu.git diff --git a/src/ieee754/cordic/fpsin_cos.py b/src/ieee754/cordic/fpsin_cos.py index c61e6bf2..3c96cafa 100644 --- a/src/ieee754/cordic/fpsin_cos.py +++ b/src/ieee754/cordic/fpsin_cos.py @@ -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,