Flyttalslib till 16F887 ?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Flyttalslib till 16F887 ?

Inlägg av guckrum »

Jag tror på ändå på heltalsaritmetik. Enkelt att skala upp till valfri noggranhet och ingenting faller utanför om det blir för litet. Välj bara en konstant faktor som du multiplicerar alla reella tal med och du har full kontroll. Möjligen kan du hitta snabbare algoritmer som använder flyttal, men det finns väl inga parametrar in till din algoritm som uppdateras i realtid förutom vad klockan är, och den vet man ju hur den beter sig, så inga realtidsproblem?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Det är ju ett sätt, men kan bli ganska hyfsat många bits. Det finns en god anledning att använda flyttal.

IEEE-32 med sina ynka 23 bits ger endast 6.92 siffrors noggrannhet
IEEE-64 med 52 bits ger 15.65 siffror.
Nuvarande lib med 31 bits ger 9.33 siffror.
Utökas det till 47 bits blir det 14.15 siffror.

Jag antar att gcc float är IEEE-32 och det blir blaj. Double är väl IEEE-64 och det blir beräkningar inom 1 minut från en professionell tabell. Frågan är vad 9 siffror kan åstadkomma. Med 14 siffror antar jag att det räcker. Vad anser Ni som är mycket kunnigare?

Sedan är det kanske en annan sak vad befintligt lib verkligen ger. Där är gjort en del förenklingar. Att det används samma för sin/cos gör knappast någon skada, men att använda arctan till arcsin och arccos blir en hel del vridande och vändande som säkert dribblar bort några bits.

Tillägg: Konstanterna som används är 12 siffror som mest. Så med 14 borde noggrannheten tas tillvara någorlunda. Eller är där någon felkälla jag är för okunnig att förstå som ställer till det mer än det tåler?
Jag vet att add/sub där exponenterna skiljer är mycket obra och förvärras kraftigt med kortare mantissa, men kan för lite för att bedöma vad det gör här. Enda sättet för mig är att testa...
Användarvisningsbild
rvl
Inlägg: 6428
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Flyttalslib till 16F887 ?

Inlägg av rvl »

Glad amatör, men ordningsföljden av beräkninarna i algorimen man använder, kan ha betydelse för den resulterande noggrannheten. Inte nödvändigtvis trivialt att få reda på den bästa ordningen, som kan bero på vilka numeriska värden som råkar ingå.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Letade och hittade en del om detta. Får se vad jag kan få ihopa när allt blir klart. Kommer först att följa det jag testat i C så långt det går. Det fungerar utmärkt med antagligen 53 bits noggrannhet. Hoppas det blir bra även med 47 bits.

Har bestämt mig för att testa det alternativet. Dubbelt upp mot IEEE-32, Det tar upp 8 bytes totalt. Det förloras en byte på inledande etta och 7 oanvända ihop med teckenbit. Så måste det bli i ett opackat format, redo att bearbeta.
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Flyttalslib till 16F887 ?

Inlägg av guckrum »

Jag tycker det låter som att du har rätt bra koll på det. När man adderar/subtraherar flyttal sker först en skift av mantissan så att exponenterna blir samma. Man kan se det som att man förlorar precision, men det är ju precis så flyttal är designade: mantissan följer med exponenten upp och ner och ger den skenbara effekten att upplösningen ser ut att vara större än vad den i verkligheten är. Ofta går det bra. Ibland inte. Mera sällan är det någon som faktiskt kontrollerar om det blev rätt eller inte. Det räcker ju till Excel.

Och precis som rvl säger så spelar ordningen vid addition roll, så vill man ha determinism i sina beräkningar får man tänka ett varv till. Kanske börja med att sortera talen. Men det kostar exekveringstid typ Nlog(N), så...

64 bitar heltalsaritmetik (nästan 20 siffror) istället för flyttal alla dagar i veckan om precisionen räcker för applikationen tycker jag.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Med ett visst bitantal är det ännu bättre att ha dessa bits som mantissa i ett flyttal. Den del av programmet som slukar tid är ungefär densamma.


Hursom, nu är så pass myckat av detta flyttalslib konverterat till 47bit att det är möjligt beräkna sinus. Det fanns trunkerade siffror kvar i boken. Upphovsmannen hade gett hänvisningar, så nu är dessa inkluderade.

Resultatet blev sådär. Tolfte siffran viker från vad gcc double ger. Boken utlovar 13.2 siffror. Det kanske räcker. Bra mycket bättre än IEEE32 med ynka 6.9 siffror.

sin(67deg)=
0.92050485345905 fplib 13,2utlovas, 12:e viker
0.92050485345244 gcc double

Återstår att se om jag pallar maxxa upp tan och arctan. arc-sin/cos/tan bygger på arctan. Boken lovar arctan 9.06 siffror, tan 8.2 . Måste åtgärdas. Kommer sannolikt att behöva lite hjälp med detta. Tänker då på algoritmen i pseudokod.
Användarvisningsbild
rvl
Inlägg: 6428
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Flyttalslib till 16F887 ?

Inlägg av rvl »

Blir det samma resultat med cos(23°)? ...eller göra sinusbedömningen med en vinkel <=45?
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Flyttalslib till 16F887 ?

Inlägg av guckrum »

Marta skrev: 29 november 2024, 13:49:45 Med ett visst bitantal är det ännu bättre att ha dessa bits som mantissa i ett flyttal. Den del av programmet som slukar tid är ungefär densamma.
Här tänker vi olika :)
Marta skrev: 29 november 2024, 13:49:45 Hursom, nu är så pass myckat av detta flyttalslib konverterat till 47bit att det är möjligt beräkna sinus. Det fanns trunkerade siffror kvar i boken. Upphovsmannen hade gett hänvisningar, så nu är dessa inkluderade.

Resultatet blev sådär. Tolfte siffran viker från vad gcc double ger. Boken utlovar 13.2 siffror. Det kanske räcker. Bra mycket bättre än IEEE32 med ynka 6.9 siffror.

sin(67deg)=
0.92050485345905 fplib 13,2utlovas, 12:e viker
0.92050485345244 gcc double
Kul att det funkar. Oroande att det inte blir samma svar dock. Har du kollat hur stort felet blir över en större mängd vinklar?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Med t.ex. 23deg så viker 13:de siffran

0.39073112848932 fplib
0.39073112848927 gcc double

Felet är nog vad som kan förväntas. Det blev några bits över från tabellerna som inte fick plats i 6 bytes. Skulle nog fått plats med 56 bits med skohorn. Även 64 om det lagts i bank2 så de variabler som är rena lagringsplatser kunnat läggas i bank3 och addresseras indirekt.
Senast redigerad av Marta 29 november 2024, 15:07:02, redigerad totalt 1 gång.
Användarvisningsbild
rvl
Inlägg: 6428
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Flyttalslib till 16F887 ?

Inlägg av rvl »

Vill minnas det var optimerat för +-pi/4, så man får använda komplement för beräkningar utanför.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Letade nu i boken efter tabeller som ger den noggrannhet som passar för 47 bits och hittade en som ger 13 siffror. Till min förvåning är där 25 siffror i talen. inte ens 64-bit kan ta emot ett så långt tal.

Hur går det här ihop? Det förefaller orimligt. Antar här är något bortom vad jag begriper. Någon som kan reda ut begreppen?
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Flyttalslib till 16F887 ?

Inlägg av guckrum »

Kan du publicera algoritmen?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Kod: Markera allt

                               *                      00259 ; =================================================================
                               *                      00260 ;       TAN(x*PI/4) = x * P(x*x)/Q(x*x)
                               *                      00261 ;
                               *                      00262 ;       Formula 4242, pg216
                               *                      00263 ;       TAN
                               *                      00264 ;       0 90   90+       180- 180   270-  270      360-
                               *                      00265 ;       0,1,1,INF | -INF,-1,-1,-0 | 0,1,1,INF | INF,-1,-1,-0
                               *                      00266 ;
                               *                      00267 ;       We can compute TAN 0 to 45 degrees directly
                               *                      00268 ;
                               *                      00269 ;       IDENTITIES
                               *                      00270 ;       TAN(X) = TAN(X MOD 180)
                               *                      00271 ;       Y = X MOD 45
                               *                      00272 ;       QUAD 0 if(X >= 0 && < 45)
                               *                      00273 ;       TAN     = TAN(Y);
                               *                      00274 ;       QUAD 1 if(X >= 45 && < 90)
                               *                      00275 ;       TAN     = 1/TAN(45-Y);
                               *                      00276 ;       QUAD 2 if(X >= 90 && < 135)
                               *                      00277 ;       TAN     = -1/TAN(Y);
                               *                      00278 ;       QUAD 3 if(X >= 135 && < 180)
                               *                      00279 ;       TAN     = -TAN(45-Y));
                               *                      00280 ;
                               *                      00281 ;       NOTE SAME TAN_SCALE BASIS IS USED IN COMPUTATION, KINDA NICE!
                               *                      00282 ;
                               *                      00283 ;===============================================================
M_TAN_SCALE .eq M_4_PI         *  0000005D            00284 M_TAN_SCALE     equ     M_4_PI  ; 1.2732395447e+00 (temp real)
                               *                      00285 ;
M_TANP1                        *0488                  00286 M_TANP1 ; -1.2528888728e+01 (temp real)
        rtl a,#0
        rtl a,#0
        rtl a,#0x07 ; (0) LSB  *0488   3407           00287         retlw   0x07 ; (0) LSB
        rtl a,#0x54 ; (1)      *0489   3454           00288         retlw   0x54 ; (1)
        rtl a,#0x76 ; (2)      *048A   3476           00289         retlw   0x76 ; (2)
        rtl a,#0xc8 ; (3) MSB  *048B   34C8           00290         retlw   0xc8 ; (3) MSB
        rtl a,#0x82 ; (4) EXP  *048C   3482           00291         retlw   0x82 ; (4) EXP
        rtl a,#0x80 ; (5) SIGN *048D   3480           00292         retlw   0x80 ; (5) SIGN
                               *                      00293
M_TANP2                        *048E                  00294 M_TANP2 ; 2.1184936966e+02 (temp real)
        rtl a,#0
        rtl a,#0
        rtl a,#0x4a ; (0) LSB  *048E   344A           00295         retlw   0x4a ; (0) LSB
        rtl a,#0x70 ; (1)      *048F   3470           00296         retlw   0x70 ; (1)
        rtl a,#0xd9 ; (2)      *0490   34D9           00297         retlw   0xd9 ; (2)
        rtl a,#0xd3 ; (3) MSB  *0491   34D3           00298         retlw   0xd3 ; (3) MSB
        rtl a,#0x86 ; (4) EXP  *0492   3486           00299         retlw   0x86 ; (4) EXP
        rtl a,#0x00 ; (5) SIGN *0493   3400           00300         retlw   0x00 ; (5) SIGN
                               *                      00301
M_TANQ1                        *0494                  00302 M_TANQ1 ; 1.0000000000e+00 (temp real)
        rtl a,#0
        rtl a,#0
        rtl a,#0x00 ; (0) LSB  *0494   3400           00303         retlw   0x00 ; (0) LSB
        rtl a,#0x00 ; (1)      *0495   3400           00304         retlw   0x00 ; (1)
        rtl a,#0x00 ; (2)      *0496   3400           00305         retlw   0x00 ; (2)
        rtl a,#0x80 ; (3) MSB  *0497   3480           00306         retlw   0x80 ; (3) MSB
        rtl a,#0x7f ; (4) EXP  *0498   347F           00307         retlw   0x7f ; (4) EXP
        rtl a,#0x00 ; (5) SIGN *0499   3400           00308         retlw   0x00 ; (5) SIGN
                               *                      00309
M_TANQ2                        *049A                  00310 M_TANQ2 ; -7.1414530935e+01 (temp real)
        rtl a,#0
        rtl a,#0
        rtl a,#0x66 ; (0) LSB  *049A   3466           00311         retlw   0x66 ; (0) LSB
        rtl a,#0x3d ; (1)      *049B   343D           00312         retlw   0x3d ; (1)
        rtl a,#0xd4 ; (2)      *049C   34D4           00313         retlw   0xd4 ; (2)
        rtl a,#0x8e ; (3) MSB  *049D   348E           00314         retlw   0x8e ; (3) MSB
        rtl a,#0x85 ; (4) EXP  *049E   3485           00315         retlw   0x85 ; (4) EXP
        rtl a,#0x80 ; (5) SIGN *049F   3480           00316         retlw   0x80 ; (5) SIGN
                               *                      00317
M_TANQ3                        *04A0                  00318 M_TANQ3 ; 2.6973501312e+02 (temp real)
        rtl a,#0
        rtl a,#0
        rtl a,#0xe9 ; (0) LSB  *04A0   34E9           00319         retlw   0xe9 ; (0) LSB
        rtl a,#0x14 ; (1)      *04A1   3414           00320         retlw   0x14 ; (1)
        rtl a,#0xde ; (2)      *04A2   34DE           00321         retlw   0xde ; (2)
        rtl a,#0x86 ; (3) MSB  *04A3   3486           00322         retlw   0x86 ; (3) MSB
        rtl a,#0x87 ; (4) EXP  *04A4   3487           00323         retlw   0x87 ; (4) EXP
        rtl a,#0x00 ; (5) SIGN *04A5   3400           00324         retlw   0x00 ; (5) SIGN
                               *                      00325
_FP_TAN                        *04A6                  00326 _FP_TAN:        ; FPac = TAN(FPac)
                               *                      00327         TRarg_TABLE_LD  M_TAN_SCALE     ; TRarg = M_TAN_SCALE
                               *                          M         TABLE_SET_SOURCE        M_TAN_SCALE
                               *                          M         LOAD16I table_ptr,M_TAN_SCALE
                               *                          M         IN_LOADI table_ptr,M_TAN_SCALE,2
                               *  0000                    M         local index = 0
                               *                          M         WHILE index < 2
                               *                          M         LOAD8I table_ptr+index, ((M_TAN_SCALE) >> (index*8)) & 0xff
        lod a,#<M_TAN_SCALE/2  *04A6   305D               M         movlw LOW(((M_TAN_SCALE) >> (index*8)) & 0xff)
        lod table.ptr,a        *04A7   00A6               M         movwf table_ptr+index
                               *  00000001                M index   = index + 1
                               *                          M         LOAD8I table_ptr+index, ((M_TAN_SCALE) >> (index*8)) & 0xff
        lod a,#>M_TAN_SCALE/2  *04A8   3000               M         movlw LOW(((M_TAN_SCALE) >> (index*8)) & 0xff)
        lod table.ptr+1,a      *04A9   00A7               M         movwf table_ptr+index
                               *  00000002                M index   = index + 1
                               *                          M         ENDW
        jsr _TRarg_TABLE_LD    *04AA   203F               M         CALL _TRarg_TABLE_LD
                               *                      00328
                               *                      00329         FP_MUL
        jsr _FP_MUL            *04AB   22CB               M         CALL    _FP_MUL
                               *                      00330         FP_QUAD
        jsr _FP_QUAD           *04AC   2421               M         CALL    _FP_QUAD
                               *                      00331         JMP_BCLR        FPquad,0,_FP_tan_1
                               *                          M         SKIP_BSET FPquad,0
        sbs FPquad,0           *04AD   1C50               M         btfss FPquad,0
                               *                          M         JMP     _FP_tan_1
        jmp _FP_tan_1          *04AE   2CB2               M         goto    _FP_tan_1
                               *                      00332         FParg_ONE                       ; FParg = 1.0
        jsr _FParg_ONE         *04AF   21FA               M         CALL    _FParg_ONE
                               *                      00333         FPac_SWAP
        jsr _FPac_SWAP         *04B0   21EB               M         CALL    _FPac_SWAP
                               *                      00334         FP_SUB                  ; xp = 1.0 - xp
        jsr _FP_SUB            *04B1   228D               M         CALL    _FP_SUB
_FP_tan_1                      *04B2                  00335 _FP_tan_1
                               *                      00336         TABLE_SET_TRarg ; TRarg = Default Table load
        jsr _TABLE_SET_TRarg   *04B2   202E               M         CALL    _TABLE_SET_TRarg
                               *                      00337         TRac_STORE      FParg1          ; FParg1 = xp
        lod a,#FParg1          *04B3   3044               M         movlw   FParg1
        jsr _TRac_STORE        *04B4   21DF               M         CALL    _TRac_STORE
                               *                      00338         FPac_CLR                        ; p = 0
        jsr _FPac_CLR          *04B5   21F4               M         CALL    _FPac_CLR
                               *                      00339         TABLE_SET_SOURCE        M_TANP1
                               *                          M         LOAD16I table_ptr,M_TANP1
                               *                          M         IN_LOADI table_ptr,M_TANP1,2
                               *  0000                    M         local index = 0
                               *                          M         WHILE index < 2
                               *                          M         LOAD8I table_ptr+index, ((M_TANP1) >> (index*8)) & 0xff
        lod a,#<M_TANP1/2      *04B6   3088               M         movlw LOW(((M_TANP1) >> (index*8)) & 0xff)
        lod table.ptr,a        *04B7   00A6               M         movwf table_ptr+index
                               *  00000001                M index   = index + 1
                               *                          M         LOAD8I table_ptr+index, ((M_TANP1) >> (index*8)) & 0xff
        lod a,#>M_TANP1/2      *04B8   3004               M         movlw LOW(((M_TANP1) >> (index*8)) & 0xff)
        lod table.ptr+1,a      *04B9   00A7               M         movwf table_ptr+index
                               *  00000002                M index   = index + 1
                               *                          M         ENDW
                               *                      00340         POLY_FParg1             ; p += Constant, p *= xp
        jsr _POLY_FParg1       *04BA   23FB               M         CALL    _POLY_FParg1
                               *                      00341         FP_MUL                  ; p *= xp
        jsr _FP_MUL            *04BB   22CB               M         CALL    _FP_MUL
                               *                      00342         POLY_FParg1             ; p += Constant, p *= xp
        jsr _POLY_FParg1       *04BC   23FB               M         CALL    _POLY_FParg1
                               *                      00343         TRac_STORE      FParg2  ; p
        lod a,#FParg2          *04BD   304A               M         movlw   FParg2
        jsr _TRac_STORE        *04BE   21DF               M         CALL    _TRac_STORE
                               *                      00344
                               *                      00345         TABLE_SET_SOURCE        M_TANQ1
                               *                          M         LOAD16I table_ptr,M_TANQ1
                               *                          M         IN_LOADI table_ptr,M_TANQ1,2
                               *  0000                    M         local index = 0
                               *                          M         WHILE index < 2
                               *                          M         LOAD8I table_ptr+index, ((M_TANQ1) >> (index*8)) & 0xff
        lod a,#<M_TANQ1/2      *04BF   3094               M         movlw LOW(((M_TANQ1) >> (index*8)) & 0xff)
        lod table.ptr,a        *04C0   00A6               M         movwf table_ptr+index
                               *  00000001                M index   = index + 1
                               *                          M         LOAD8I table_ptr+index, ((M_TANQ1) >> (index*8)) & 0xff
        lod a,#>M_TANQ1/2      *04C1   3004               M         movlw LOW(((M_TANQ1) >> (index*8)) & 0xff)
        lod table.ptr+1,a      *04C2   00A7               M         movwf table_ptr+index
                               *  00000002                M index   = index + 1
                               *                          M         ENDW
                               *                      00346         FPac_CLR                ; p = 0
        jsr _FPac_CLR          *04C3   21F4               M         CALL    _FPac_CLR
                               *                      00347         POLY_FParg1             ; q += Constant, q *= xp
        jsr _POLY_FParg1       *04C4   23FB               M         CALL    _POLY_FParg1
                               *                      00348         FP_MUL                  ; q *= xp
        jsr _FP_MUL            *04C5   22CB               M         CALL    _FP_MUL
                               *                      00349         POLY_FParg1             ; q += Constant, q *= xp
        jsr _POLY_FParg1       *04C6   23FB               M         CALL    _POLY_FParg1
                               *                      00350         FP_MUL                  ; q *= xp
        jsr _FP_MUL            *04C7   22CB               M         CALL    _FP_MUL
                               *                      00351
                               *                      00352         TABLE_LD                ; FParg = Constant
        jsr _TABLE_LD          *04C8   2013               M         CALL    _TABLE_LD
                               *                      00353         FP_ADD                  ; q += Constant
        jsr _FP_ADD            *04C9   2292               M         CALL    _FP_ADD
                               *                      00354         TRarg_LOAD      FParg2                  ; FPac = q, FParg = p
        lod a,#FParg2          *04CA   304A               M         movlw   FParg2
        jsr _TRarg_LOAD        *04CB   21E3               M         CALL    _TRarg_LOAD
                               *                      00355
                               *                      00356         AND8I   FPquad,3
        lod a,#3               *04CC   3003               M         movlw 3
        and FPquad,a           *04CD   05D0               M         andwf FPquad,f
                               *                      00357
                               *                      00358         CMP8I   FPquad,1                        ; FPquad == 1
        lod a,#1               *04CE   3001               M         movlw 1
        sur a,FPquad           *04CF   0250               M         subwf FPquad,w
                               *                      00359         JMP_Z   _fp_tan_2                       ; q / p
                               *                          M         SKIP_NZ
                               *                          M         SKIP_BCLR       STATUS,Z
        sfc z                  *04D0   1903               M         btfsc   STATUS,Z
                               *                          M         JMP     _fp_tan_2
        jmp _fp_tan_2          *04D1   2CD7               M         goto    _fp_tan_2
                               *                      00360         CMP8I   FPquad,2                        ; FPquad == 2 ?
        lod a,#2               *04D2   3002               M         movlw 2
        sur a,FPquad           *04D3   0250               M         subwf FPquad,w
                               *                      00361         JMP_Z   _fp_tan_2                       ; q / p
                               *                          M         SKIP_NZ
                               *                          M         SKIP_BCLR       STATUS,Z
        sfc z                  *04D4   1903               M         btfsc   STATUS,Z
                               *                          M         JMP     _fp_tan_2
        jmp _fp_tan_2          *04D5   2CD7               M         goto    _fp_tan_2
                               *                      00362         FPac_SWAP                                       ; p / q
        jsr _FPac_SWAP         *04D6   21EB               M         CALL    _FPac_SWAP
_fp_tan_2                      *04D7                  00363 _fp_tan_2
                               *                      00364         FP_DIV
        jsr _FP_DIV            *04D7   22FD               M         CALL    _FP_DIV
                               *                      00365         JMP_BCLR        FPquad,1,_fp_tan_3      ; FP_quad & 4
                               *                          M         SKIP_BSET FPquad,1
        sbs FPquad,1           *04D8   1CD0               M         btfss FPquad,1
                               *                          M         JMP     _fp_tan_3
        jmp _fp_tan_3          *04D9   2CDC               M         goto    _fp_tan_3
                               *                      00366         XOR8I   FPac_SIGN,0x80          ; xp = -xp
        lod a,#0x80            *04DA   3080               M         movlw 0x80
        eor FPac_SIGN,a        *04DB   06AF               M         xorwf FPac_SIGN,f
_fp_tan_3                      *04DC                  00367 _fp_tan_3
                               *                      00368         XOR8    FPac_SIGN,FPflag        ; xp ^= FPflag
        lod a,FPflag           *04DC   0851               M         movfw FPflag
        eor FPac_SIGN,a        *04DD   06AF               M         xorwf FPac_SIGN,f
                               *                      00369         ENDSUB
        rts                    *04DE   0008               M         return
        .bc                       *                      00370


Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

Nu funkar atan någorlunda. Det var lite stökigt att få till, men jag antar det är så bra det kan bli med 47 bits. Tabellen innehåller 22 siffror och det får inte plats, blir trunkerat till drygt 14. Antar att med de förutsättningarna är 11 siffror vad som kan förväntas. Vad säger Ni som kan? Jag är nybörjare på detta.

atan(2.0)
1.10714871779409 gcc
1.1071487177333 fplib

Tabellen hade ett fel, en sifferposition är blank. Samma i alla de kopior jag fått tag i... Jag löste det empiriskt. Kom fram till att det är 7 som saknas. Det är OCR, så i teorin kan det finnas blaj i de konstanter som används.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7237
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Flyttalslib till 16F887 ?

Inlägg av Marta »

1.10714871779409 gcc
1.1071487177940 fplib

Det ingår en konstant till som jag missat räkna om med rätt noggrannhet, nu är den omräknad.
Skriv svar