<?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=2871&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-04-16T11:30:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2871&amp;mode</id>
<entry>
<author><name><![CDATA[Paul Dirac]]></name></author>
<updated>2013-04-16T11:30:38+01:00</updated>
<published>2013-04-16T11:30:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34432#p34432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34432#p34432"/>
<title type="html"><![CDATA[Re: #define a liczby zmiennoprzecinkowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34432#p34432"><![CDATA[
fajny pomysł, jak w &quot;blue pill&quot; z tym adc.  Napewno kiedyś wykorzystam coś podobnego i wiem gdzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1035">Paul Dirac</a> — 16 kwi 2013, o 11:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-15T21:46:36+01:00</updated>
<published>2013-04-15T21:46:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34412#p34412</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34412#p34412"/>
<title type="html"><![CDATA[Re: #define a liczby zmiennoprzecinkowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34412#p34412"><![CDATA[
Stałymi zdefiniowanymi ze znaczkiem # zajmuje się preprocesor i takie wyrażenia zostają obliczone wcześniej i mikrokontroler nie musi się tym zajmować, więc nie ma potrzeby dołączania funkcji do działań na liczbach zmiennoprzecinkowych.<br />Mnożenie dwóch ułamków dziesiętnych:<br />[syntax=c]uint32_t x_multiplier = 1, y_multiplier = 1;<br />for (uint8_t i = 0; i &lt; x.fract_length; i++){ x_multiplier *= 10; }<br />for (uint8_t i = 0; i &lt; y.fract_length; i++){ y_multiplier *= 10; }<br />//X<br />if(x.total) ltoa(x.total, bufx, 10);<br />if(x.fract)<br />{<br />   ltoa(x.fract, buf, 10);//fract without leading zeros<br />   sizex = strlen(buf); //number of digits<br />   for(uint8_t i = 0; i &lt; x.fract_length - sizex ; i++)<br />      strcat(bufx, &quot;0&quot;);//add zeros before fract part<br />   strcat(bufx, buf);//add fract<br />}<br />#if mode == debug<br />tft_puts( 200, 170, bufx, green, BG_COLOR );<br />#endif<br />//Y<br />if(y.total) ltoa(y.total, bufy, 10);<br />if(y.fract)<br />{<br />   ltoa(y.fract, buf, 10);<br />   sizey = strlen(buf);<br />   for(uint8_t i = 0; i &lt; y.fract_length - sizey; i++)<br />      strcat(bufy, &quot;0&quot;);<br />   strcat(bufy, buf);<br /> }<br />#if mode == debug<br />tft_puts( 200, 190, bufy, green, BG_COLOR );<br />#endif<br />temp = (int64_t)atol(bufx) * atol(bufy);//multiply 2 intigers<br />if(x.sign * y.sign &lt; 0) strcpy(buf, &quot;-&quot;);<br />else strcpy(buf, &quot;&quot;);<br />ltoa( temp/(x_multiplier * y_multiplier), bufy, 10);//total<br />strcat(buf, bufy);<br />temp = temp%(x_multiplier * y_multiplier);//fract part<br />if(temp)//if fract &gt; 0<br />{<br />   strcat(buf, &quot;,&quot;);<br />   uint8_t lenght = 0;<br />   uint64_t multiplier = x_multiplier * y_multiplier;//result multiplier<br />   ltoa(temp, bufx, 10);<br />   while(multiplier/10) { multiplier /= 10; lenght++; }<br />   for(uint8_t i = 0; i &lt; lenght - strlen(bufx); i++)<br />      strcat(buf, &quot;0&quot;);//add zeros<br />   strcat(buf, bufx);<br />   while(buf&#91;strlen(buf)-1&#93; == '0') buf&#91;strlen(buf)-1&#93; = '\0'; //remove zeros at the end<br /> }<br />#if mode == debug<br />tft_puts( 200, 150, buf, blue, BG_COLOR );<br />#endif[/syntax]<br />a struktura opisująca liczbę wygląda następująco:<br />[syntax=c]typedef struct<br />{<br />int8_t sign;<br />uint32_t total;<br />uint32_t fract;<br />uint8_t fract_length;<br />} DECIMAL;[/syntax]<br />Chodzi o to, że jeśli mamy do pomnożenia np. 45,4 * 2,015 to wykonujemy mnożenie dwóch liczb całkowitych 454*2015 = 914810 i znając ilość cyfr po przecinku 1 i 3 obliczamy pozycję przecinka okrężną drogą, bo najpierw część stała to 914810/(10^1*10*3) = 914810/10000 = 91 - dzielenie całkowite, a potem część ułamkowa 914810%10000=4810 co po połączeniu daje 91,4810. Sprawa komplikuje się gdy zamieniamy część ułamkową na ciąg znaków, bo jeśli w 2,015 część ułamkowa wynosi 015 to po zamianie mamy 15 i trzeba dodać to zero.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 15 kwi 2013, o 21:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ledes]]></name></author>
<updated>2013-04-14T18:50:04+01:00</updated>
<published>2013-04-14T18:50:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34305#p34305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34305#p34305"/>
<title type="html"><![CDATA[#define a liczby zmiennoprzecinkowe]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2871&amp;p=34305#p34305"><![CDATA[
Witam,<br /><br />[syntax=c]#define K_P     45.30<br />#define K_I     7.20<br />#define K_D     1.10[/syntax]<br />Ten kod ma liczby rzeczywiste (zmiennoprzecinkowe), ale nie są traktowane jak one. Tzn. zajętość kodu programu nie rośnie gwałtownie. Teraz tak: chcę zamiast tego define wprowadzać je sam z ekranu dotykowego. To mam, tylko chodzi o to, jak zrobić aby reprezentować w programie 45.30 bez użycia double, float i #define? To ma user podawać. Jak to jest, że jest to define a w nim 45.3 i dalej operacje na tym a kod programu nie rośnie jak przy<br />[syntax=c]const double K_P = 45.3;[/syntax]<br /><br />Chciałbym wiedzieć, dlaczego w pierwszym przypadku nie pożera mi kilka % pamięci FLASH, a w drugim tak skoro to jest ta sama liczba i jak zrobić aby bez #define (bo zmienne) i bez double/float jednak operować potem na tym 45.3 (dla przykładu).<br /><br />Zrobiłem strukturę reprezentującą liczbę rzeczywistą, ale z tym define wydaje mi się dziwne.<br />[syntax=c]typedef struct<br />{<br />bool isReal;<br />bool isValid;<br />bool isMinus;<br />int intPart;<br />int fractPart;<br />} numKbdResult;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=355">Ledes</a> — 14 kwi 2013, o 18:50</p><hr />
]]></content>
</entry>
</feed>