www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Arduino Mega2560 in matematika
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Mar 29, 2020 7:55 pm    Naslov sporočila:  Arduino Mega2560 in matematika Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
polkic
Član
Član



Pridružen-a: Pon 04 Dec 2017 20:27
Prispevkov: 68
Aktiv.: 0.88

PrispevekObjavljeno: Ned Mar 29, 2020 8:30 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Mar 29, 2020 8:41 pm    Naslov sporočila:   Odgovori s citatom

Vse sem že probal long, double, rezultat je vedno napačen,
nevem kaj naj še storim !

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
rafaellsi
Član
Član



Pridružen-a: Ned 11 Sep 2011 18:54
Prispevkov: 478
Aktiv.: 3.12
Kraj: Radovljica

PrispevekObjavljeno: Ned Mar 29, 2020 9:28 pm    Naslov sporočila:  Re: Arduino Mega2560 in matematika Odgovori s citatom

Kaj pa takole:


Koda:


float  x=(float) z * (float) y;
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Mar 29, 2020 9:54 pm    Naslov sporočila:   Odgovori s citatom

Nalepša hvala, sedaj deluje.
Samo ne vem zakaj je to potrebno vedno povdarjati.

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Pon Mar 30, 2020 12:37 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jan
Član
Član



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.44
Kraj: Dolenjska

PrispevekObjavljeno: Pon Mar 30, 2020 2:44 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Pon Mar 30, 2020 2:54 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
kastaneda
Član
Član



Pridružen-a: Pet 23 Okt 2009 11:18
Prispevkov: 458
Aktiv.: 2.60

PrispevekObjavljeno: Pon Mar 30, 2020 5:09 pm    Naslov sporočila:   Odgovori s citatom

Č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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.92
Kraj: Grosuplje

PrispevekObjavljeno: Pon Mar 30, 2020 7:20 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Tor Mar 31, 2020 1:57 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.92
Kraj: Grosuplje

PrispevekObjavljeno: Tor Mar 31, 2020 3:45 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Sre Apr 01, 2020 1:12 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.92
Kraj: Grosuplje

PrispevekObjavljeno: Sre Apr 01, 2020 8:54 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.89
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Apr 02, 2020 6:00 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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: 67 dni


Powered by phpBB © 2001, 2005 phpBB Group