Téma: Dělení
Jak vydělím čísla např 3/5=0,6 ?
Dostanu jenom
3/5 = 0
3 % 5 =3
Dík
SDS PLC/PAC: Měření Energie & OnlineTechnology.cz
Network Monitoring System - SDS - Síťový Dohledový Systém
Nejste přihlášen. Přihlaste se, nebo se zaregistrujte.
Stránky 1
Chcete-li přispívat, musíte se přihlásit nebo projít procesem registrace.
Jak vydělím čísla např 3/5=0,6 ?
Dostanu jenom
3/5 = 0
3 % 5 =3
Dík
SDS-C má v aktuální verzi jen celá čísla.
Např. teplota z teplotních čidel se udává násobená 100, takže např. 12.56°C dostanete jako 1256.
Podobně je potřeba přistupovat i k vlastním výpočtům - je potřeba si určit požadovanou přesnost.
Pak pro váš příklad:
SDS-C: 3/5 = 0
1. určete přesnost - např. 1 místo, což je 10 na 1, což je 10
2. vynásobte dělenec požadovanou přesností: 3 * 10^1 = 30
3. 30/5 = 6
4. celé číslo (dělit výsledek přesností): 6 / 10 = 0
5. desetinná část (modulo výsledku přesností): 6 % 10 = 6
Zkuste si to pro jiné čísla a pro jiné přesnosti...
Prosím o radu jak to dělení použít ve výpočtu,a jak z těch dvou výsledků, jednotek a desetinné části zase udělat celé číslo.
Chci si vytvořit výpočet výkonu TČ z rozdílu dvou teplot čidel a průtoku. Zkusil jsem vzoreček implantovat do SDS-C a narazil jsem právě na problém s dělením. Přicházím o desetinná místa.
Vytvořil jsem toto :
//---vypocet vykonu tc------------------------
delta_t_tc
{
t1 = sys[311]; //zde nastavit sys[] TC vystup
t2 = sys[316]; //zde nastavit sys[] TC vstup
k = 4200;
q_tc = 1800;
t1 = t1 / 100; //zde prijdu o desetinna mista
t2 = t2 / 100;
t3 = t1 - t2;
echo('Delta teplot TC t3 je',t3,' °C...');
p_tc = (t3 * k * q_tc) / 3600;
p_tc = p_tc / 1000; // zde prijdu o desetinna mista
echo('Vykon TC je',p_tc,' W...');
return;
}
Výsledek chci pak použít pro výpočet COP
Děkuji
Vždyť mi to tu vysvětlil.
nedělte t1 a t2 stem, ale přímo t3=t2-t1
stupne=t3/100
desetiny=t3%100
echo ("teplota je",stupne,"." desetiny,"°c");
p_tc = (t3 * k * q_tc) / 3600;
p_tc = p_tc *100/ 1000; // zde uz neprijdu o desetinna mista
p_tc_cela=p_tc/100
p_tc_desetiny=p_tc%100
echo (pt_tc_cela,"."pt_c_desetiny);
Ten rozklad jsem pochopil, ale pokud nevydělím ty teploty stem a rovnou odečtu t3=t1-t2, (v příkladu je to 1000) tak mi pak ten vzorec p_tc hodí při krokování nesmyslně záporné číslo.
viz screen http://www.volny.cz/videoservis/deleni.htm
Jestli to nepřekračuje rozsah 32bit. Zkuste to pokrátit. Nepřed násobíte tisícema, pak dělíte.
Jestli to nepřekračuje rozsah 32bit. Zkuste to pokrátit. Nepřed násobíte tisícema, pak dělíte.
jj, to bylo ono
dík za spolupráci
Pozor, čísla jsou 32 bitové, ale nejvyšší bit je určen pro znaménko (signed long).
Rozsah je tedy potřeba počítat na 31 bitů (tj. maximum je 2147483648).
Výše uvedená implementace dělení (rozkladu na celou a desetinnou část) funguje jen pro zbytky, které mají správný počet platných číslic.
Příklad: pokud je teplota 15.07°C SDS-C tedy dostane hodnotu 1507.
Pokud číslo vydělíme 100 dostaneme 15 a při funkci modulo dostaneme : 7, nikoliv 07.
Pokud potom odešleme nebo zobrazíme takto získanou teplotu, dostaneme hodnotu 15.7°C nikoliv 15.07°C.
Pokud bychom chtěli větší preciznost a násobili 1000, pak může chyba nastat i u všech dvoumístných zbytků.
Je zde třeba buď: vždy postupně dělit 10 a zapisovat si jednotlivé znaky nebo zavést podmínku if(zbytek<10) { echo '0'; echo zbytek; }
apod.
U teploty je chyba v řádu 1°C snesitelná, nikoliv však při hlídání stavu nabití baterie, kde jsem si toho všiml,
když 12.09V má baterie jen zčásti nabitá, ale 12.9 plně nabitá. Na grafech to dělalo pěkné skoky.
Ano, je potřeba ručne doplnit nulu tak jak je popsáno. Ve firmware to např. používáme pro výpisy teplot na webové stránky.
Proto je vhodné v SDS-C programu dělení neprovádět a využít SDS-C program jen pro předávání dat na server nebo webové stránce atd.
Výpočty pak provést na serveru nebo až pomocí JS na webové stránce.
Stránky 1
Chcete-li přispívat, musíte se přihlásit nebo projít procesem registrace.