Forum » Programiranje » c++ preverjanje stevil
c++ preverjanje stevil
alum ::
zanima me, kako bi v c++ naredil naslednje...preveril ce je dolocena cifra decimalnega stevila enaka naslednji....(npr. 0,112 -> izpustim 0 oz. zacnem s prvim decimalnim mestom, preverim, ce je 1 enako 1, nato ce je 1 enako 2, ....)
Gundolf ::
Enostavno!
Vse decimalke zapises v tabelo in potem v tabeli pregledujes, ce sta vsaj dva zaporedna elementa enaka.
Da te prehitim, ker vem da bos vprasal kako pospraviti decimalke v tabelo. Stevilko pomnozis z 10, pretvoris v int, das v tabelo in ponavljas vajo dokler ni stevilka enaka 0.
Vse decimalke zapises v tabelo in potem v tabeli pregledujes, ce sta vsaj dva zaporedna elementa enaka.
Da te prehitim, ker vem da bos vprasal kako pospraviti decimalke v tabelo. Stevilko pomnozis z 10, pretvoris v int, das v tabelo in ponavljas vajo dokler ni stevilka enaka 0.
Zvedavec ::
Mogoče je za izpis v tabelo enostavneje uporabiti kar sprintf.
Tole zaporedno množenje z 10 pri plavajoči vejici mi je malček sumljivo zaradi zaokrožitvenih napak. In najbrž zato številka tudi nikoli ne bo res enaka 0.
Tole zaporedno množenje z 10 pri plavajoči vejici mi je malček sumljivo zaradi zaokrožitvenih napak. In najbrž zato številka tudi nikoli ne bo res enaka 0.
Phil ::
VIdim da sta me ze dva prehitela, ampak vseeno:
float stevilo; // cifra ki jo dobis podano
int dec_mest=5; // stevilo dec. mest ki te zanima
float novo_stevilo=(float)((float)stevilo-(int)stevilo); // znebis se celega dela stevila
novo_stevilo*=10; // pomaknes vejico za eno v desno
int ena=0,dve=0;
int i=0;
while (i manj (dec_mest-1)) {
ena=novo_stevilo; // prvo decimalno mesto
novo_stevilo=(float)((float)novo_stevilo-(int)ena); // spet se znebis celega dela stevila
novo_stevilo*=10; // pomaknes vejico za eno v desno
dve=novo_stevilo; // drugo decimalno mesto
// primerjas, pogledas ena,dve....
i++;
}
Nisem preveril, ce dela pravilno, algoritem naj bi bil nekaj takega.
LP
float stevilo; // cifra ki jo dobis podano
int dec_mest=5; // stevilo dec. mest ki te zanima
float novo_stevilo=(float)((float)stevilo-(int)stevilo); // znebis se celega dela stevila
novo_stevilo*=10; // pomaknes vejico za eno v desno
int ena=0,dve=0;
int i=0;
while (i manj (dec_mest-1)) {
ena=novo_stevilo; // prvo decimalno mesto
novo_stevilo=(float)((float)novo_stevilo-(int)ena); // spet se znebis celega dela stevila
novo_stevilo*=10; // pomaknes vejico za eno v desno
dve=novo_stevilo; // drugo decimalno mesto
// primerjas, pogledas ena,dve....
i++;
}
Nisem preveril, ce dela pravilno, algoritem naj bi bil nekaj takega.
LP
alum ::
hm....
ok...hvala za pomoc...vseeno se mi pojavi tezava...
stvar deluje vredu, ce izpisem cifre prvih desetih decimalk...ce pa jih hocem izpisati dvajset se pojavi problem, saj jih do 16 mesta izpise brez problema, medtem ko se pri 17 mestu ze pojavijo napake:
1 / 7 = 14285714285714280096-850989568
Kot kaze ze pri 17 mestu zmanjka natancnosti ( ce uporabim double...ce uporabim float mu zmanjka ze par mest prej:).
Kako bi resil to stvar oz. cifre izpisal bolj natancno (vsaj do 20ega mesta)??
Lp, wakum
ok...hvala za pomoc...vseeno se mi pojavi tezava...
stvar deluje vredu, ce izpisem cifre prvih desetih decimalk...ce pa jih hocem izpisati dvajset se pojavi problem, saj jih do 16 mesta izpise brez problema, medtem ko se pri 17 mestu ze pojavijo napake:
1 / 7 = 14285714285714280096-850989568
Kot kaze ze pri 17 mestu zmanjka natancnosti ( ce uporabim double...ce uporabim float mu zmanjka ze par mest prej:).
Kako bi resil to stvar oz. cifre izpisal bolj natancno (vsaj do 20ega mesta)??
Lp, wakum
Gundolf ::
Lahko poslusas Zvedavec-ev nasvet in uporabis sprintf. Ta ti sicer nafila tabelo tipa char ampak ne bi smel imeti tezav s pretvarjanjem znakov v inte.
Drugace pa lahko namesto da mnozis stevilo z 10 in naslednic to pomnozeno se enkrat z 10 naredis tako, da prvotnega stevila ne spreminjas (morda mu le odstranis celi del, ce ga ima) in ga prvic mnozis z 10, drugic s 100, tretjic s 1000, ... Nato mu pobijes decimalke (uporabis funkcijo floor ali floorf) pretvoris v int in moduliras z 10 (tvoja_cifra % 10). Ce bos hotel pa se vecjo natancnost bos pa res moral uporabiti neko ze sprogramirano pretvarjanje floatov v stringe ali pa pogledati IEEE standard in izbrskati nacin za direktno izlocanje osnove ter eksponenta stevila ter ju nato ustrezno pretvoriti (katera opcija se ti zdi lazja )
Drugace pa lahko namesto da mnozis stevilo z 10 in naslednic to pomnozeno se enkrat z 10 naredis tako, da prvotnega stevila ne spreminjas (morda mu le odstranis celi del, ce ga ima) in ga prvic mnozis z 10, drugic s 100, tretjic s 1000, ... Nato mu pobijes decimalke (uporabis funkcijo floor ali floorf) pretvoris v int in moduliras z 10 (tvoja_cifra % 10). Ce bos hotel pa se vecjo natancnost bos pa res moral uporabiti neko ze sprogramirano pretvarjanje floatov v stringe ali pa pogledati IEEE standard in izbrskati nacin za direktno izlocanje osnove ter eksponenta stevila ter ju nato ustrezno pretvoriti (katera opcija se ti zdi lazja )
Gundolf ::
Ker vidim da te ocitno zanimajo decimalke (in njihovo ponavljanje) pri rezultatu deljenja te bom spomnil se na to, da lahko tudi sam sprogramiras deljenje (ce znas deliti rocno do n-te decimalke natancno bos pa menda znal prepricati v to tudi racunalnik). Pa se dobil bos tocno toliko decimalk, kot ti jih srce pozeli :) Se vec, celo nadleznega zaokrozevanja se bos znebil (primer: 0.666666666667).
OwcA ::
Opozoriti velja, da osnovno zaokrožitveno napako (za double po IEEE 10^-16) pridelaš že na vhodu, za večjo natnačnost potrebuješ alternativno predstavitev števila od vsega začetka.
Otroška radovednost - gonilo napredka.
Zgodovina sprememb…
- spremenilo: OwcA ()
CCfly ::
Če hočeš res natančne izračune, bi moral potem delati v četvorni natančnosti, da bi zmanjšal zaokrožitvene napake. Kaj pa računaš da ti double ne zadostuje ?
"My goodness, we forgot generics!" -- Danny Kalev
alum ::
hvala vam lejpa...stvar deluje....se je izkazalo, da je bila natancnost kljub vsemu dovoljsna
brez skrbi da se v kratkem spet obrnem na vas
lp, wakum
brez skrbi da se v kratkem spet obrnem na vas
lp, wakum
CCfly ::
Naj podam post od Tomy[y]:
Imam naslednjo tezavo...
Besedilo naloge: M je naravno število, 1/M je periodično število.
Primer:
1/7 = 0.(142857)
1/100 = 0.01(0)
1/22 = 0.0(45)
V oklepaju je označen periodični del. Napišite program, ki
za M < 1000000 določi periodičen del!
Ima kdo mogoče kakšno idejo? bi bilo zelo priporočljivo :)
Podvojena tema pa bo v naslednjem trenutku zaklenjena.
Imam naslednjo tezavo...
Besedilo naloge: M je naravno število, 1/M je periodično število.
Primer:
1/7 = 0.(142857)
1/100 = 0.01(0)
1/22 = 0.0(45)
V oklepaju je označen periodični del. Napišite program, ki
za M < 1000000 določi periodičen del!
Ima kdo mogoče kakšno idejo? bi bilo zelo priporočljivo :)
Podvojena tema pa bo v naslednjem trenutku zaklenjena.
"My goodness, we forgot generics!" -- Danny Kalev
]Fusion[ ::
Ne razumem kak je lahko natančnost dovolj, če se lahko pri recimo številu 1/7614 ponovi 7614 decimalk. No nekaj takega smo pri Analizi rekli... Pomoje bi moral naredit ročno množenje.
"I am not an animal! I am a human being! I... am... a man!" - John Merrick
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | float vs decimalOddelek: Programiranje | 6240 (4373) | Looooooka |
» | Število decimalk???Oddelek: Programiranje | 1566 (1070) | donkihod |
» | Mnozenje float stevil (C)Oddelek: Programiranje | 1556 (1219) | Isotropic |
» | Rusko množenje (strani: 1 2 )Oddelek: Znanost in tehnologija | 10788 (7912) | fireice |
» | branje iz datoteke c/c++Oddelek: Programiranje | 1445 (1314) | Vesoljc |