|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Ned Mar 29, 2020 7:55 pm Naslov sporočila: Arduino Mega2560 in matematika |
|
|
Hi
Imam problem z matematiko.
Zakaj ne morem zmnožit števil ki so večje od 32767 ?
Prilagam codo, karkoli naredim je napačen rezultat.
Koda: |
//#include <math.h>
void setup() {
Serial.begin(9600);
}
void loop() {
int z=10923;
int y=3;
float x=z*y; //rezultat = 32769 ,ker je večji od 32767 pa ne zračuna pravilno
//
Serial.println("presledek");
Serial.println(x);
delay(1000);
}
|
Hvala za kakršen koli nasvet.
LP,marko |
|
Nazaj na vrh |
|
|
polkic Član
Pridružen-a: Pon 04 Dec 2017 20:27 Prispevkov: 68 Aktiv.: 0.87
|
Objavljeno: Ned Mar 29, 2020 8:30 pm Naslov sporočila: |
|
|
Pozdravljen,
imaš podatke tipa INT, rezultat pa tipa float (decimalna vejica). Predvidem, da si dal float, ker "naj bi" pokazal do večjega števila. To se zgodi, če uporabiš decimalno piko, drugače vzame bazo od INT, kar pa je 32767.
Citiram: |
If doing math with floats, you need to add a decimal point, otherwise it will be treated as an int. See the Floating point constants page for details. |
Predlagam, da uporabiš podatek tipa "long", ki je velik 4 byte.
Lep pozdrav. |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Ned Mar 29, 2020 8:41 pm Naslov sporočila: |
|
|
Vse sem že probal long, double, rezultat je vedno napačen,
nevem kaj naj še storim !
lp, |
|
Nazaj na vrh |
|
|
rafaellsi Član
Pridružen-a: Ned 11 Sep 2011 18:54 Prispevkov: 478 Aktiv.: 3.11 Kraj: Radovljica
|
Objavljeno: Ned Mar 29, 2020 9:28 pm Naslov sporočila: Re: Arduino Mega2560 in matematika |
|
|
Kaj pa takole:
Koda: |
float x=(float) z * (float) y;
|
|
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Ned Mar 29, 2020 9:54 pm Naslov sporočila: |
|
|
Nalepša hvala, sedaj deluje.
Samo ne vem zakaj je to potrebno vedno povdarjati.
lp, |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Pon Mar 30, 2020 12:37 pm Naslov sporočila: |
|
|
Hi
Sedaj pa imam nov problem.
Zakaj tukaj ni pravilen rezultat: float d=23.45*sinus; dobim da je d=2.74, pravilen rezultat pa je 2.81.
Če pa napišem: float d2=23.45*0.12; //=2.81 pa je rezultat pravi
Kje delam napako?
Koda: |
void setup() {
Serial.begin(9600);
}
void loop() {
float z=360;
float y=372;
float x=(z*y)/365; //=366.90 OK
float q=(x*3.14)/180; //=6.4 OK
float sinus=sin(q); //=0.12 OK
float d=23.45*sinus; //pravi rezultat =2.81 meni pa zračuna d= 2.74
float d2=23.45*0.12; //=2.81 OK
Serial.println("presledek");
Serial.println(sinus);
Serial.println(d);
Serial.println(d2);
delay(1000);
}
|
LP, |
|
Nazaj na vrh |
|
|
Jan Član
Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.44 Kraj: Dolenjska
|
Objavljeno: Pon Mar 30, 2020 2:44 pm Naslov sporočila: |
|
|
Vrednost "sinus" si malo preveč zaokrožil pri tvojem preverjanju.
Ti si vzel za njegovo vrednost 0.12, dejansko pa je 0.11698...
Od tukaj je tudi razlika 2.74 (dejansko pravilno) namesto 2.81.
Preveri še enkrat s kalkulatorjem.
Jan |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Pon Mar 30, 2020 2:54 pm Naslov sporočila: |
|
|
Preverjeno s kalkulatorjem, rezultat mora biti 2.81.
Ne vem zakaj pride do tega, ko vstavim spremenljivko "sinus" v formulo je rezultat napačen, ko pa vstavim število 0.12 je pa pravilen rezultat, spremenljivka sinus=0.12
lp. |
|
Nazaj na vrh |
|
|
kastaneda Član
Pridružen-a: Pet 23 Okt 2009 11:18 Prispevkov: 458 Aktiv.: 2.59
|
Objavljeno: Pon Mar 30, 2020 5:09 pm Naslov sporočila: |
|
|
Če je kot podan v stopinjah, je sinus kota 0.11153284 .
Če je podan v radianih, je rezultat 0.1202080449 _________________ LP
Srečko |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.90 Kraj: Grosuplje
|
Objavljeno: Pon Mar 30, 2020 7:20 pm Naslov sporočila: |
|
|
marko11 je napisal/a: |
Preverjeno s kalkulatorjem, rezultat mora biti 2.81..... |
Če ne zaokrožuješ na dve decimalki:
- 360*372/365=366,90410958904109589041095890411
- 366,90410958904109589041095890411*3.14/180=6,4004383561643835616438356164384
- sin(6,4004383561643835616438356164384)=0,1169845623702388854048869411605
- 23.45*0,1169845623702388854048869411605=
- moj kalkulator kaže 2,7432879875821018627445987702137
če pa računaš:
- sin(6.4)=0,11654920485049328948042048879895
- to pomnožiš s 23.45,
- potem dobiš 2,7330788537440676383158604623353
Z Arduino strani:
Citiram: |
Description
Datatype for floating-point numbers, a number that has a decimal point. Floating-point numbers are often used to approximate analog and continuous values because they have greater resolution than integers. Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. They are stored as 32 bits (4 bytes) of information. |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Tor Mar 31, 2020 1:57 pm Naslov sporočila: |
|
|
Hi
Sem zdaj pogruntal, da on dela z radiani, jaz pa s stopinjami,
tako, da je potrebna pretvorba v stopinje.... to je sedaj rešeno.
Iščem osnovna SLO navodila za programiranje v C-ju za arduino.
Nekoč sem jih že našel, kjer je bilo vse lepo opisano čisto od začetka, kdaj se piše piko, vejico, podpičje itd.. in razlaga spremenljivk in ukazov,
Pa te strani nisem shranil, sedaj pa iščem in iščem pa ne najdem.
Mogoče ima kdo kašen naslov do te strani.
lp, |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.90 Kraj: Grosuplje
|
Objavljeno: Tor Mar 31, 2020 3:45 pm Naslov sporočila: |
|
|
marko11 je napisal/a: |
Sem zdaj pogruntal, da on dela z radiani, jaz pa s stopinjami,
tako, da je potrebna pretvorba v stopinje.... |
Ko pogledam gornji program, vidim, da se stopinje pretvarjajo v radiane :
q=x*3.14/180 ; x so stopinje in rezultat q so radiani.
marko11 je napisal/a: |
Iščem osnovna SLO navodila za programiranje v C-ju za arduino.
Nekoč sem jih že našel, kjer je bilo vse lepo opisano čisto od začetka, kdaj se piše piko, vejico, podpičje itd.. in razlaga spremenljivk in ukazov,
Pa te strani nisem shranil, sedaj pa iščem in iščem pa ne najdem.
Mogoče ima kdo kašen naslov do te strani. |
Ali ni bilo nekaj na strani Svet elektronike?
Drugače si pa pomagaj z Google prevajalnikom.
Bom pogledal med svojo literaturo, če imam kaj napisanega v slovenščini. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Sre Apr 01, 2020 1:12 pm Naslov sporočila: |
|
|
@Jaka57 Zdaj sem jaz to napravil malo drugače, pa me zanima, če sem to prav napravil, rezultat mora biti v STOPINJAH. Formula za izračun kv je v prvi vrstici.
Jaka, če imaš kaj volje, da pregledaš, če sem jaz to pravilno zračunal.
Moj rezultat je: kv = 34.97 stopinj
Koda: |
void loop() {
// kv = arcsin [ sin(L) * sin(D) + cos(L) * cos(D) * cos(h) ]
float L=45.85; //stop.
float h=15; //stop.
float D=7.53; //stop.
float sinL = sin(radians (L));
float sinD = sin(radians (D));
float cosL = cos(radians (L));
float cosD = cos(radians (D));
float cosH = cos(radians (h));
float formula_2 = (sinL * sinD) + (cosL * cosD * cosH);
float kv = asin(formula_2)*180/3.14; //tukaj pretvori v stopinje
Serial.println(kv);
delay(1000);
|
lp, |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.90 Kraj: Grosuplje
|
Objavljeno: Sre Apr 01, 2020 8:54 pm Naslov sporočila: |
|
|
marko11, ne vem, moja mega1280 mi izračuna 49.58, enak rezultat dobim, če računam z Win kalkulatorjem na roke.
Dočim spodnji program, kjer je uporabljena konstanta PI , vrne 49.56.
Enak rezultat je, če v tvojem programu uporabim PI namesto 3.14 in enako, če računam na roke.
Koda: |
float L=45.85*PI/180; //stopinje v radiane
float H=15*PI/180; //stopinje v radiane
float D=7.53*PI/180; //stopinje v radiane
float kv;
void setup(){
Serial.begin(9600);
}
void loop() {
// kv = arcsin [ sin(L) * sin(D) + cos(L) * cos(D) * cos(h) ]
kv = asin(sin(L)*sin(D)+ cos(L)*cos(D)*cos(H))*180/PI; //tukaj pretvori v stopinje
Serial.println(kv);
delay(1000);
} |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Čet Apr 02, 2020 6:00 pm Naslov sporočila: |
|
|
Jaka57@
Sem pa res cepec, napisal sem napačen rezultat, pravilno si zračunal in tudi moja plata pravilno zračuna. Ej, oprosti, ne vem kam sem gledal. Ko bo enkrat te korone konec pa bo treba na kako pivo skočit.
lp, |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|