logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Funkcje sin, cos arcsin arccos większa dokładność na atmega.

mlfox85 19 Paź 2009 21:54 6057 19
REKLAMA
  • #1 7149922
    mlfox85
    Poziom 10  
    Witam czy jest możliwość zwiększenia precyzji obliczania funkcji trygonometrycznych i wogóle wszystkich obliczeń takich jak mnożenie i t d
  • REKLAMA
  • #3 7150019
    mlfox85
    Poziom 10  
    chciałbym wykorzystać pełne możliwości zmiennych double
  • REKLAMA
  • #4 7150306
    Freddie Chopin
    Specjalista - Mikrokontrolery
    w avr-libm double == float i nic na to nie poradzisz. Jak chcesz większej precyzji to wypadałoby poznać coś większego niż AVR, bo obliczenia na 64-bitach to chyba niezbyt pasują do 8-bitowego układziku...

    4\/3!!
  • REKLAMA
  • #5 7151704
    tmf
    VIP Zasłużony dla elektroda
    Zawsze mozna zastosowac koprocesor arytmetyczny :) Ten co prawda tez operuje tylko na 32-bitach, ale juz mozna go wykorzystac do czegos wiecej:
    http://www.nkcelectronics.com/umfpu-v31-floating-point-coprocessor-18pin3118.html
    No i sa algorytmy, nawet proby implementacji na AVR, z tym, ze tak jak Freddie pisze sens tego watpliwy - szukaj pod haslem CORDIC.
  • REKLAMA
  • #6 7158588
    asembler
    Poziom 32  
    fukcje trygonometryczne mocna wyliczyc z dowolna dokladnoscia za pomocą wielomianów a to ze to 8-bitowy to akurat mało ważne. Ważne do czego potrzebujesz uzywac wyniku operacji tak aby czas liczenia funkcji nie powodowal zbytnich opoznien w dzialaniu programu.
  • #7 7158958
    OldSkull
    Poziom 28  
    Ztablicuj sobie ćwiartkę sinusa (aby mieć całego sinusa i kosinusa) jako tabicę const (np. const int sinus[500];), podobnie pozostałe funkcje. Sam sobie dobierzesz wymaganą dokładność i rozdzielczość. Niestety pamięci flash atmegi zużyjesz mnóstwo.
  • #8 7159211
    Konto nie istnieje
    Poziom 1  
  • #9 7159630
    piti___
    Poziom 23  
    atom1477 napisał:
    Mnóstwo? Przy 32bitach to będzie w okolicach 1GB.


    Jak to obliczyłeś? tablica 500 elementów 32bitowych to tylko 2000B
  • #10 7159772
    Konto nie istnieje
    Poziom 1  
  • #11 7160041
    OldSkull
    Poziom 28  
    Potrzebujesz kroku wielkości 21 nanostopni (BTW: 16GB)? Tysiąc razy większy (21u) i już tylko 17MB (wciąż dużo), ale już 21m jest całkiem realne (17kB) i wciąż bardzo dokładne. Przede wszystkim musisz się zastanowić czy rzeczywiście potrzebujesz aż takiej dokładności. Pamiętaj, że nie musisz tablicować całego okresu, wystarczy tablicować część.
  • #12 7262070
    szym86
    Poziom 13  
    Mam pytanie :
    czy jak mam policzyć sin i cos , to mogę cosinus otrzymać przekształcając to równanie : sin^2(x) + cos^2(x) = 1 ?
  • #13 7262270
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Możesz, tylko po co, skoro można to zrobić 10000000x łatwiej wiedząc że cosinus to sinus dla przesuniętego argumentu? Nie mówiąc już nawet o tym, że funkcje biblioteczne pewnie robią to właśnie tym sposobem...

    4\/3!!
  • #14 7262825
    vontas
    Poziom 11  
    Polecam zapoznac sie z pojeciem szeregu Maclaurina. Umozliwi on obliczenie wartosci sin oraz cos z dowolna dokladnoscia. Podstawy teoretyczne i przyklady mozna znalezc na Wikipedii.
  • #15 7265355
    mlfox85
    Poziom 10  
    wszystko pięknie tylko, że microkontroler, oblicza sinusa i cosinusa za pomocą szeregów McLorina i wykozystuje do tego standardową dokładność obliczeń dla atmega. Można by próbować napisać coś co pozwala na dodawanie i odejmowanie liczb 32 bitowych ale to pracochłonne i nie koniecznie się uda, a pozatym bardzo obciąży procesor. Pozostaje jedynie procesor 16 bitowy. A co do obliczania cos z równania 1= cos^2(x)+sin^2 (x) da się ale wynik będzie ten sam i dokładność ta sama.
  • #16 7266565
    szym86
    Poziom 13  
    A co jest dziedziną funkcji trygonometrycznych w atmedze ? zakres 0-360stopni czy może liczba 0-1 ? Czy jeszcze jakoś inaczej . Po prostu czym jest x ?
  • #18 7412595
    asembler
    Poziom 32  
    sin(x)= x-x^n/n!+x^(n+2)/(n+2)!
    n=3,7,11,15,19,23..........
    dowolna dikladnosc
    rozwijajac:
    sin(x)=x-x^3/3!+x^5/5!-x^7/7!+x^9/9!..................
    Dla reszty funkcji trygonometrycznych i logarytmów tez istnieja takie szeregi.

    Ale z tego co widze to koledze nie chce sie napisac (lub odpisac) podstawowych funkcji matematyczny wiekszej dokladnosci niz 8 bitów, wiec ten post jest bez sensu.
    Jezeli kolega by chcial to mam szybkie procedury "+-*/" w ASM dzialające na liczbach 2 kodzie BCD z dowolną dokładnością. Dlaczego w kodzie BCD bo przedstawinie liczb na wyswietlaczu nie stanoni problemu a dokładnosc okreslamy jako ilosc cyfr znaczących
  • #19 7412717
    mlfox85
    Poziom 10  
    udało mi się sprawdzić ze w C właśnie w za pomocą szeregów liczbowych oblicza się funkcje sin i t p, dokładność tak uzyskana jest dla mnie nie wystarczająca. Czy mógłbyś sprawdzić czy dokładność uzyskana za pomocą twoich funkcji jest większa? A wrzucić funkcje i tak możesz, komuś mogą się przydać.
  • #20 7412869
    asembler
    Poziom 32  
    jak napisałem dokladnosc dowolna ograniczona do pamieci RAM procesora
    12 liczb po przecinku wystarczy dla mnie w wiekszosci jest wystarczajac a uzywam tego w module kalkulatora i nie zauwazam znaczącego opoznienia w wyswietlaniu wyniku. Moze musisz zadeklarowac odpowiedni typ zmiennej np dooble precision? Nie znam sie akurat na C ale w innych jezykach word to 8 bitów longint to 16 bit dooble precision to 32-bity a cos sie mi obilo ze 32 bity to akurat dla ciebie wystarczyloby. A może w koncu okresl co dla ciebie jest wystarczającą dokładnością.
REKLAMA