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

avr gcc - operacje zmiennoprzecinkowe

mgradzki 27 Gru 2008 23:25 2666 4
REKLAMA
  • #1 5910834
    mgradzki
    Poziom 16  
    Witam
    Nigdy nie działałem za zmiennym przecinku, ale teraz muszę policzyć nie za ciekawy wzór i muszę to zrobić na typie Double
    Mam funkcję

    
    double fp_calc(void)
    {
    double fp;
    double HUMI=55;
    double TEMP=293.15;
    fp=((272.186*log(HUMI/100))+((6107.85384*TEMP)/(272.186+TEMP)))/(22.4433-log(HUMI/100)-(22.4433*TEMP)/(272.186+TEMP))-273.15;
    return fp;
    } 
    


    Wywaliłem z niej wszystko, co nie jest absolutnie niezbędne, nawet parametry podałem jako zmienne zadeklarowane przed obliczeniami.

    W innej procedurze tak obliczoną wartość wyświetlam na wyświetlaczu LCD. Procedura wyświetlania jest na pewno dobra - podawałem do niej liczby typu double i wszystko grało.

    Ten sam wzór w MS Excelu daje wynik ok. -9,6, a przy użyciu ATMEGA64 wyświetla mi jakieś krzaki - więc program gdzieś się wywala

    Próbowałem dzielić ten wzór na części i obliczać po kawałku, ale efekt jest dokładnie ten sam.

    Może powinienem wiedzieć coś więcej na temat operacji zmiennoprzecinkowych, żeby zrobić to poprawnie - jeśli ktoś wie, czemu to nie działa to proszę o info, bo poważnie utknąłem.

    Dzięki
    Pozdrawiam i dobrego Nowego Roku
  • REKLAMA
  • #2 5911042
    Freddie Chopin
    Specjalista - Mikrokontrolery
    dokompilowac zmiennoprzecinkowe biblioteki...

    https://www.elektroda.pl/rtvforum/topic1059204.html

    tak BTW to typ double dla wiekszosci inkarnacji gcc jest rownowazny typowi float. do przestawienia w opcjach kompilacji.

    4\/3!!
  • REKLAMA
  • #3 5915203
    mgradzki
    Poziom 16  
    Nie używam AVR STUDIO, używam edytora z WinAVR. Typy zmiennoprzecinkowe raczej u mnie działają, bo bez problemu liczy pierwiastek, a nawet takiego potworka:
    
    dp=10*(sqrt(sqrt(sqrt(HUMI/100)))*(112+0.9*TEMP)+0.1*TEMP-112);
    


    Zagnieżdżone pierwiastki kwadratowe w celu uzyskania pierwiastka 8 stopnia.

    Kombinuję i dalej nic.

    Pozdrawiam
  • REKLAMA
  • #4 5915233
    _Robak_
    Poziom 33  
    Sprobuj podzielic wzor na kawalki i te kawalki wyswietl bedziesz wiedzial w ktorym miejscu jest problem
  • #5 5915772
    Dr.Vee
    VIP Zasłużony dla elektroda
    Co do pierwiastka 8 stopnia to poczytaj o funkcji pow().

    Pozdrawiam,
    Dr.Vee
REKLAMA