banjalukaforum.com https://www.banjalukaforum.com/ |
|
Dev C++ nezna sabirati! https://www.banjalukaforum.com/viewtopic.php?f=18&t=27480 |
Stranica 1 od 2 |
Autoru: | Nemanja666 [ 28 Mar 2007, 10:23 ] |
Tema posta: | Dev C++ nezna sabirati! |
Pogledajte ovaj kod. Vjezbajuci za takmicenje nasao sam gresku u C++. Problem sam pojednostavio. Kompajliraj te sa Dev C++ 4.9.9.2. Rezultat je 152 umjesto 153. Kod: #include <cstdlib>
#include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { int a, b, c, d; a = 1; b = 5; c = 3; d = 0; d += int(pow(a, 3)); d += int(pow(b, 3)); d += int(pow(c, 3)); cout << d; system("PAUSE"); return EXIT_SUCCESS; } |
Autoru: | Not now, John! [ 28 Mar 2007, 10:44 ] |
Tema posta: | |
Je li bolje sa "double a,b,c,d"? |
Autoru: | Nemanja666 [ 28 Mar 2007, 10:51 ] |
Tema posta: | |
Not now, John! je napisao: Je li bolje sa "double a,b,c,d"?
Ne pomaze! Ali ako se strapa sve u istu liniju radice. Na ovo sam naletio slucajno praveci funkciju za racunanje zbira kubova cifara cijelog broja. |
Autoru: | S [ 30 Mar 2007, 08:49 ] |
Tema posta: | |
Zna sabirati. Problem ti je u konverziji u int. |
Autoru: | che.guevara [ 01 Apr 2007, 12:51 ] |
Tema posta: | |
Eto šta pascal učini od čovjeka ![]() |
Autoru: | Nemanja666 [ 01 Apr 2007, 13:56 ] |
Tema posta: | |
Svedno ima gresku koja me je ubila u pojam. |
Autoru: | Not now, John! [ 02 Apr 2007, 02:02 ] |
Tema posta: | |
Ja ne kontam gdje se gubi jedinica. "pow" vraća cjelobrojnu vrijednost, pa se ta vrijednost konvertuje u "int", što je opet cjelobrojna vrijednost. Druga je stvar kad se iz "float" konvertuje u "int". |
Autoru: | TheDragon [ 02 Apr 2007, 06:46 ] |
Tema posta: | |
Funkcija za stepenovanje vraca vrijednost tipa double, niposto celobrojnu vrednost, pa bi mozda ovo kod tebe radilo: Kod: #include <cstdlib>
#include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { double a, b, c, d; a = 1; b = 5; c = 3; d = 0; d +=pow(a, 3); d +=pow(b, 3); d +=pow(c, 3); cout << d; system("PAUSE"); return EXIT_SUCCESS; } Mozda ti John-ov savjet za double nije pomogao jer si zaboravio da uklonis konverziju u int... |
Autoru: | S [ 02 Apr 2007, 07:58 ] |
Tema posta: | |
Tacno, vraca double sto znaci da treba izbaciti one koverzije u int sto opet znaci da kompajler nema gresku. |
Autoru: | che.guevara [ 02 Apr 2007, 10:17 ] |
Tema posta: | |
Ljudi bas ne znate ![]() Pow racuna stepen broja a na neki eksponent b. Formula po kojoj radi je otprilike ovakva: x = a^b // logaritmuje levu i desnu stranu logx = log(a^b) logx = b*loga x = antilog(b*loga) Dakle umesto da stepenuje "klasicno", on racuna loga, mnozi ga sa b i onda antilogaritmuje, pri tom se ne dobija 100% tacno resenje (sto je nemoguce) i zato kod pretvaranja u int gubi vrednost (ako zaokruzi 1 na 0.9999 npr). Zasto radi ovako, a ne tako sto mnozi a sa a b puta - jednostavno - probajte da na taj nacin izracunate pi^e ... |
Autoru: | TheDragon [ 02 Apr 2007, 17:45 ] |
Tema posta: | |
che.guevara je napisao: Ljudi bas ne znate
![]() Tvoje objasnjenje je na mjestu, ali ipak ne obrazlaze resenje problema. Sta predlazes sem (moje) gore navedene korekcije? |
Autoru: | che.guevara [ 02 Apr 2007, 19:15 ] |
Tema posta: | |
Pa radi i to tvoje ali ako hoćeš int onda moraš prvo da zaokružiš double na neku celobrojnu vrijednost, tj. koristiš funkciju round, pa onda int. Ako samo koristiš int, to je valjda kao da si uradio floor pa int, a ustvari u većini slučajeva treba da se uradi ceil pa int, e da ne bi to ručno provjeravao uradiš round i ćao ![]() |
Autoru: | borisdj [ 03 Apr 2007, 21:31 ] |
Tema posta: | |
che.guevara je napisao: Ljudi bas ne znate
![]() Pow racuna stepen broja a na neki eksponent b. Formula po kojoj radi je otprilike ovakva: x = a^b // logaritmuje levu i desnu stranu logx = log(a^b) logx = b*loga x = antilog(b*loga) Dakle umesto da stepenuje "klasicno", on racuna loga, mnozi ga sa b i onda antilogaritmuje, pri tom se ne dobija 100% tacno resenje (sto je nemoguce) i zato kod pretvaranja u int gubi vrednost (ako zaokruzi 1 na 0.9999 npr). Zasto radi ovako, a ne tako sto mnozi a sa a b puta - jednostavno - probajte da na taj nacin izracunate pi^e ... Pa ako je problem u funkciji pow napravi svoju funkciju za racunanje eksponenta pa je pozoves kad ti treba. Evo ti primjer #include<stdio.h> float eksp(float n,float a) { int i; float c=1; for(i=1;i<=a;i++) c=c*n; return c; } main() { float m,p,y; printf("Unesi bazu i eksponent"); scanf("%f%f",&m,&p); y=eksp(m,p); printf("%f",y); getchar(); getchar(); } |
Autoru: | salex [ 08 Apr 2007, 03:59 ] |
Tema posta: | |
che.guevara je napisao: Ljudi bas ne znate
![]() Pow racuna stepen broja a na neki eksponent b. Formula po kojoj radi je otprilike ovakva: x = a^b // logaritmuje levu i desnu stranu logx = log(a^b) logx = b*loga x = antilog(b*loga) Dakle umesto da stepenuje "klasicno", on racuna loga, mnozi ga sa b i onda antilogaritmuje, pri tom se ne dobija 100% tacno resenje (sto je nemoguce) i zato kod pretvaranja u int gubi vrednost (ako zaokruzi 1 na 0.9999 npr). Zasto radi ovako, a ne tako sto mnozi a sa a b puta - jednostavno - probajte da na taj nacin izracunate pi^e ... Ti ne znas. Izgleda da je greska u kompajleru jer isti takav source pod gcc-om radi bez problema. U ostalom nema logike da broj koji je u floatu 125 da se pri konverziji u int predje u 124. E sad da je bilo 124.999999, onda bi vec tu bilo mjesta za diskusiju. Sto se tice devcpp-a mislim da na se na njemu u zadnje vrijeme nista ne radi pa bi samo valjalo ubaciti noviju verziju kompilera, i vjerovatno bi sve bilo ok. borisdj: Dobra ideja za rjesenje problema ali je problem sto ljudi na takmicenjima nemaju vremena da pisu iznova funkcije koje postoje i koje bi trebale da rade, a da ne govorimo jos o gubitku dragocnenog vremena. |
Autoru: | che.guevara [ 08 Apr 2007, 19:26 ] |
Tema posta: | |
salex je napisao: che.guevara je napisao: Ljudi bas ne znate ![]() Pow racuna stepen broja a na neki eksponent b. Formula po kojoj radi je otprilike ovakva: x = a^b // logaritmuje levu i desnu stranu logx = log(a^b) logx = b*loga x = antilog(b*loga) Dakle umesto da stepenuje "klasicno", on racuna loga, mnozi ga sa b i onda antilogaritmuje, pri tom se ne dobija 100% tacno resenje (sto je nemoguce) i zato kod pretvaranja u int gubi vrednost (ako zaokruzi 1 na 0.9999 npr). Zasto radi ovako, a ne tako sto mnozi a sa a b puta - jednostavno - probajte da na taj nacin izracunate pi^e ... Ti ne znas. Ček, šta ja to tačno ne znam? Pa ako ovo gore nije dostojno objašnjenje problema, onda stvarno ne znam! Način na koji se pow računa je generalno ono što sam gore opisao. Pri takvom izračunavanju, greške onog tipa su sasvim normalna i očekivana pojava. Ne kažem da int() nije mogao da zaokruži na "tačnu" vrednost ali OČIGLEDNO je da je zaokružio na nižu vrednost (realno, nije baš ni za očekivati neku preciznost od C-a). A nije sigurno ni da je to, 125 što kažeš, baš 125. Cout ili printf mogu lako da te prevare. Može ovo da se nazove greškom, iako to za C stvarno nije nikakvo čudo. Mada daleko od toga da ja ne znam, ej pazi, ja da ne znam ... ![]() borisdj: slaba ti ta funkcija ![]() |
Autoru: | che.guevara [ 08 Apr 2007, 19:31 ] |
Tema posta: | |
E i još da nisam vidio ... Zašto čiko koji je napisao ovaj kod koristi math.h umjesto cmath? TheDragon je napisao: Funkcija za stepenovanje vraca vrijednost tipa double, niposto celobrojnu vrednost
Pa baš i nije tako ... Ccc baš ne znate ... Stvarno... I još napadate ljude koji, err, znaju ![]() ![]() ![]() ![]() |
Autoru: | culaja [ 08 Apr 2007, 20:42 ] |
Tema posta: | |
Uopste ne treba vjerovati C-u na konvertovanje iz jednog u drugi tip. gcc sigurno postuje standard, a konvertovanje vjerovatno nije odredjeno standardom pa svaki kompajler vodi svoju politiku. |
Autoru: | TheDragon [ 09 Apr 2007, 11:20 ] |
Tema posta: | |
che.guevara je napisao: E i još da nisam vidio ... Zašto čiko koji je napisao ovaj kod koristi math.h umjesto cmath?
TheDragon je napisao: Funkcija za stepenovanje vraca vrijednost tipa double, niposto celobrojnu vrednost Pa baš i nije tako ... Ccc baš ne znate ... Stvarno... I još napadate ljude koji, err, znaju ![]() ![]() ![]() ![]() Sta nije tako? Zar nisam u pravu kad kazem da je vrijednost funkcije double? |
Autoru: | che.guevara [ 09 Apr 2007, 14:36 ] |
Tema posta: | |
TheDragon je napisao: che.guevara je napisao: E i još da nisam vidio ... Zašto čiko koji je napisao ovaj kod koristi math.h umjesto cmath? TheDragon je napisao: Funkcija za stepenovanje vraca vrijednost tipa double, niposto celobrojnu vrednost Pa baš i nije tako ... Ccc baš ne znate ... Stvarno... I još napadate ljude koji, err, znaju ![]() ![]() ![]() ![]() Sta nije tako? Zar nisam u pravu kad kazem da je vrijednost funkcije double? Pa nisi jebiga, u ovom slučaju vraća long double i to je razlog zašto baguje ![]() ![]() ![]() |
Autoru: | salex [ 09 Apr 2007, 23:42 ] |
Tema posta: | |
culaja je napisao: Uopste ne treba vjerovati C-u na konvertovanje iz jednog u drugi tip. gcc sigurno postuje standard, a konvertovanje vjerovatno nije odredjeno standardom pa svaki kompajler vodi svoju politiku. Bloodshed Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language. It uses Mingw port of GCC (GNU Compiler Collection) as it's compiler. Citiraj: Pa nisi jebiga, u ovom slučaju vraća long double i to je razlog zašto baguje Laughing Laughing Laughing Aha, po vasem znaci nije to bag u kompajleru. I sta sad dodje nas profa na takmicenje i pocne nesto zezati za koristenje int-a, a funkcija koristi float/double i sta onda polovini ljudi ne bude zadatak u redu. Mislim, sta reci? Citiraj: I još napadate ljude koji, err, znaju Cool
Ili se prave da sve zivo znaju..... ![]() ![]() ![]() |
Stranica 1 od 2 | Sva vremena su u UTC [ DST ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |