<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=21442&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-10-22T21:15:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21442&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2018-10-22T21:15:55+01:00</updated>
<published>2018-10-22T21:15:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212872#p212872</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212872#p212872"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212872#p212872"><![CDATA[
Jest jeszcze funkcja dtostrf double to C-string <br /><a href="https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html"  class="postlink">Tutaj</a> znajdziesz opis wielu funkcji dla avrów<br />Zastanów się też czy potrzebujesz liczby zmiennoprzecinkowej czy może wystarczy stałoprzecinkowa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 22 paź 2018, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-10-22T18:30:19+01:00</updated>
<published>2018-10-22T14:02:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212860#p212860</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212860#p212860"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212860#p212860"><![CDATA[
<div class="quotetitle">rektim napisał(a):</div><div class="quotecontent"><br />jest problem z dokładnością przy operacjach na liczbach zmiennoprzecinkowych.<br /></div><br />Problemem niekoniecznie jest float. Problem dotyczy raczej ogólnie liczb ułamkowych w pozycyjnych systemów liczbowych. Przykładowo w systemie dziesiętnym też można powiedzieć, że jest problem z dokładnością wyniku dzielenia 1 przez 3, bo ile byśmy cyfr nie użyli (oczywiście nie mówię tu o ułamku zwykłym), będzie on obarczony jakimś błędem, ponieważ jest to ułamek o rozwinięciu dziesiętnym nieskończonym. Za to przykładowo w systemie o podstawie 3 (trójkowym) zapis będzie bardzo prosty, czyli <strong>0.1</strong><br /><br />Podobnie jest w przypadku konwersji pomiędzy systemami liczbowymi (w Twoim przypadku z dziesiętnego na dwójkowy), bo nie każdy ułamek skończony w jednym systemie będzie również skończony w innym systemie. W przypadku kompilatora avr-gcc zarówno <em>float</em> jak i <em>double</em> są 32-bitowe, więc tylko taką precyzją dysponujemy, choć to w tym przypadku nie ma większego znaczenia. Bardziej chodzi o to, że liczba <strong>16.23</strong> z Twojego przykładu jest w systemie dwójkowym ułamkiem nieskończonym. Najbliższą reprezentacją liczby <strong>16.23</strong> (przy założeniu 32-bitowej precyzji) będzie liczba <strong>16.229999542236328125</strong>, resztą z dzielenia przez 16 będzie <strong>0.229999542236328125</strong>, pomnożone przez 1000 to będzie <strong>229.999542236328125</strong>. Konwersja do <strong><em>int</em></strong> (bo takiego typu argumentu oczekuje funkcja <strong><em>itoa()</em></strong> ) nie zaokrągla wyniku, tylko obcina jego część ułamkową, w efekcie czego otrzymujesz <strong>229</strong><br /><br />W programie również używasz skończonej precyzji, która (przynajmniej w momencie wyświetlania) zwykle nie przekracza 4 do 6 cyfr, przyjmijmy że w Twoim przypadku 4. Wystarczy więc podczas przygotowania do wyświetlenia części ułamkowej zaokrąglić wynik do odpowiedniej ilości cyfr, przykładowo modyfikując Twój sposób obliczeń:[syntax=c]//<br />    int16_t intpart;<br />    uint16_t fractpart;<br />    <br />    float testf = 16.23;<br /><br />    intpart = (int16_t)testf;<br />    fractpart = (uint16_t)( (fabs (fmod(testf, intpart)) * 1000 + 5) / 10 ); // fractpart = 23<br /><br />    // lub jeśli potrzebujesz trzech miejsc po przecinku<br />    fractpart = (uint16_t)( (fabs (fmod(testf, intpart)) * 10000 + 5) / 10 ); // fractpart = 230[/syntax]<br />Oczywiście można to zrobić na różne sposoby, pokazałem jak to zrobić sposobem którego użyłeś, żeby łatwiej było Ci zrozumieć sens (funkcja <strong><em>fabs()</em></strong> została użyta, aby uzyskać prawidłowy wynik dla liczb ujemnych).<br />EDIT:<br /><ul>Ta metoda ma niestety taką wadę, że nie zadziała prawidłowo dla liczb o części całkowitej równej zero. Należałoby taką sytuację uwzględnić w kodzie i zmienić sposób obliczeń. Wspomniana poniżej (przez kolegę <strong>dziobak7</strong>) funkcja <strong><em>sprintf()</em></strong> na pewno będzie wygodniejsza w użyciu. Ja tutaj raczej tylko chciałem wytłumaczyć skąd się bierze ta &quot;niedokładność&quot; liczb zmiennoprzecinkowych i że jakimś rozwiązaniem może być zaokrąglanie wartości. Jeśli wydajność kodu i zajętość pamięci nie jest problemem, to na pewno lepiej jest skorzystać z gotowych funkcji z biblioteki standardowej, jak wspomniana funkcja <strong><em>sprintf()</em></strong>. Jeśli zależy nam na wydajności i ograniczenie użytych zasobów, lepiej zrobić tak, jak wspomniałem poniżej, czyli wykonywać obliczenia na liczbach całkowitych. Wprawdzie nie zawsze da się taką metodę zastosować, ale w większości przypadków jest wystarczająca i najbardziej optymalna dla mikrokontrolerów ośmiobitowych bez FPU.</ul>ENDEDIT.<br /><br />No i tak, jak napisał kolega wyżej, stosowanie arytmetyki zmiennoprzecinkowej w 8-bitowych mikrokontrolerach AVR nie posiadających sprzętowego wsparcia dla operacji na tych liczbach jest niewskazane. Istnieją sposoby użycia zamiast tego obliczeń na liczbach całkowitych (bez utraty precyzji). Mirek na pewno nakręcił o tym (być może nie jeden) poradnik, ale ja niestety nie potrafię podać łącza (nie chce mi się szukać), a opisywanie tutaj tego po raz kolejny mija się z sensem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 22 paź 2018, o 14:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-22T08:09:02+01:00</updated>
<published>2018-10-22T08:09:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212845#p212845</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212845#p212845"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212845#p212845"><![CDATA[
Dziękuję za pomoc.<br /><br />Zrealizowałem co chciałem, poza błędem w części ułamkowej.<br /><br /><br />Czyli tak jak pisałem wyżej, program źle odczytuje mi wartość po przecinku.<br /><br />Na przykładzie liczby 16.23<br /><br />Jeżeli użyję funkcji modf, która zwraca wartość całkowitą i ułamkową, otrzymam:<br /><br /><br />zapis funkcji: DECI= modf(16.23, INT)*1000<br />DECI=229<br />INT=16<br /><br />Ale jeżeli zrobię coś takiego<br />DECI= (16.23-16)*1000, to otrzymam..... DECI=229. W rzeczywistości przypuszczam, że DECI=0,22(9).<br /><br />Być może jest problem z funkcją ITOA, która źle dzieli liczbę na znaki i stąd błąd na wyświetlaczu. Ale jak wpiszę do wyświetlenia liczbę 230 to wyświetla ją prawidłowo.<br /><br />Co może być przyczyną takiego przekręcania wyniku?<br /><br /><br />Co do samego modulo.<br />Zrobiłem sobie rozbicie liczby na cyfry w excelu korzystając z funkcji MOD i niestety przy częściach ułamkowych zaczynają się problemy- tzn. funkcja pokazuję nieprawidłowe wartości.<br />Przypuszczam, że w C będzie podobny problem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 22 paź 2018, o 08:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2018-10-20T16:28:01+01:00</updated>
<published>2018-10-20T16:28:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212810#p212810</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212810#p212810"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212810#p212810"><![CDATA[
uży jak to mowi Mirekj miodulo % , albo przesunięć bitowych, prościej sie nie da.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 20 paź 2018, o 16:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-19T16:23:56+01:00</updated>
<published>2018-10-19T16:23:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212791#p212791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212791#p212791"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212791#p212791"><![CDATA[
@Szofer<br />Jak mam podzielić?<br /><br />Korzystając z:<br />[syntax=c]double Liczba;<br />int LiczbaINT;<br />double temp;<br /><br />Liczba=16.21;<br />LiczbaINT=Liczba;<br /><br />temp=fmod(Liczba,LiczbaINT)*1000;[/syntax]<br /><br />Otrzymam:<br />LiczbaINT=16<br />temp=209, a powinno być 210- czyli przypuszczam, że jest problem z dokładnością przy operacjach na liczbach zmiennoprzecinkowych.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 19 paź 2018, o 16:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2018-10-19T15:45:39+01:00</updated>
<published>2018-10-19T15:45:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212790#p212790</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212790#p212790"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212790#p212790"><![CDATA[
podziel float na dwa inty przed przecinkiem jeden int i drugi int liczba po przecinku<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 19 paź 2018, o 15:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-19T10:36:47+01:00</updated>
<published>2018-10-19T10:36:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212786#p212786</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212786#p212786"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212786#p212786"><![CDATA[
No własnie o ile minus mi wykrywa o tyle wydaje się, ze kropki nie wykrywa.<br /><br /><br />EDIT:<br />Kropek itoa nie wykrywa (zresztą argumentem funkcji jest int, a nie double). Przy zdefiniowaniu wartości na typ większy niż int16_t funkcja sie wysypuje.<br /><br /><br />Rozumiem zatem, że jeżeli chce mieć wyświetlane liczby zmiennoprzecinkowe to zostaje mi ręczna separacja tysięcy, setek, dziesiątek itd.?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 19 paź 2018, o 10:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Szofer]]></name></author>
<updated>2018-10-19T09:20:14+01:00</updated>
<published>2018-10-19T09:20:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212784#p212784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212784#p212784"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212784#p212784"><![CDATA[
Itoa odczytuje wszystkie znaki np minus &quot;-&quot; czy przecinek kropke itp<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7664">Szofer</a> — 19 paź 2018, o 09:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-19T08:52:03+01:00</updated>
<published>2018-10-19T08:52:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212780#p212780</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212780#p212780"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212780#p212780"><![CDATA[
Działa mi na itoa z odejmowaniem 48 w zakresie +/- liczb całkowitych.<br /><br />A czy jest podobna funkcja dla liczb zmiennoprzecinkowych (double)?<br /><br />I jeszcze dodatkowe pytania. <br />1. Co mam rozumieć przez zostawienie większego buforu na &quot;-&quot; w itoa?<br />2. Funkcja itoa jest u mnie podkreślona na pomarańczowo z komunikatem: &quot;implicit declaration of function 'itoa' [-Wimplicit-function-declaration]&quot;. Czy mam się tym przejmować?<br /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 19 paź 2018, o 08:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2018-10-17T21:08:59+01:00</updated>
<published>2018-10-17T21:08:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212733#p212733</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212733#p212733"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212733#p212733"><![CDATA[
<div class="quotetitle">zubik napisał(a):</div><div class="quotecontent"><br />To itoa nie pomoże bo zmienia cyfry na znaki char<br /></div><br />Można odjąć 0x30 (48 dziesiętnie) i np. '0' zamieni się na 0, ale to tak na marginesie. Bufor do itoa powinien być o 1 większy niż spodziewany najdłuższy ciąg znaków ciąg znaków. Itoa zwraca też '-' więc to będzie 7.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 paź 2018, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-17T15:33:25+01:00</updated>
<published>2018-10-17T15:33:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212718#p212718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212718#p212718"/>
<title type="html"><![CDATA[Re: Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212718#p212718"><![CDATA[
Dzięki!<br /><br />coś drgnęło, ale nie do końca.<br /><br />Nie wiem jak mam podglądnąć tablicę do której wpisywane są znaki z liczby, ale znaki są inne niż być powinny.<br /><br />[syntax=c]char Wart&#91;4&#93;;<br /><br />itoa(1825, Wart, 10);<br /><br />cy1= Wart&#91;0&#93;;<br />cy2= Wart&#91;1&#93;;<br />cy3= Wart&#91;2&#93;;<br />cy4= Wart&#91;3&#93;;[/syntax]<br /><br />Zmienne cy są globalne. <br />Przy użyciu kodu jak powyżej wyskakują mi krzaki na wyświetlaczu (przy wpisaniu wartości &quot;z ręki&quot; wyświetlacz działa poprawnie).<br />Co może być przyczyną?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 17 paź 2018, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rektim]]></name></author>
<updated>2018-10-17T14:39:35+01:00</updated>
<published>2018-10-17T14:39:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212715#p212715</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212715#p212715"/>
<title type="html"><![CDATA[Odczyt liczby znak po znaku]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21442&amp;p=212715#p212715"><![CDATA[
Witam,<br /><br />mam pytanie o funkcję w języku c.<br /><br />Potrzebuję namierzyć &quot;coś&quot; co pozwoli mi odczytać liczbę znak po znaku, czyli np. -16,3 potrzebuję rozłożyć na:<br />-<br />1<br />6<br />,<br />3<br />Żeby móc te znaki wyświetlić na wyświetlaczu led.<br /><br />W innym języku znam funkcję mid(tekst, start, długość) i nie ma problemu- mogę odczytać każdy znak. Natomiast w c nie mogę znaleźć żadnego odpowiednika (jestem na początku drogi z C).<br /><br />Będę wdzięczny za wskazówki.<br /><br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20099">rektim</a> — 17 paź 2018, o 14:39</p><hr />
]]></content>
</entry>
</feed>