banjalukaforum.com

Dobrodošli na banjalukaforum.com
Danas je 10 Avg 2025, 16:43

Sva vremena su u UTC [ DST ]




Započni novu temu Odgovori na temu  [ 40 Posta ]  Idi na stranicu 1, 2  Sledeća
Autoru Poruka
PostPoslato: 28 Mar 2007, 10:23 
OffLine
Majstor
Majstor
Korisnikov avatar

Pridružio se: 28 Mar 2006, 11:25
Postovi: 898
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;
}

_________________
U raju je lijepo, ali u paklu je raja.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 28 Mar 2007, 10:44 
OffLine
Veteran
Veteran

Pridružio se: 12 Jul 2001, 01:00
Postovi: 3131
Lokacija: Kod roditelja
Je li bolje sa "double a,b,c,d"?

_________________
"I'd take the awe of understanding over the awe of ignorance any day."
- Douglas Adams


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 28 Mar 2007, 10:51 
OffLine
Majstor
Majstor
Korisnikov avatar

Pridružio se: 28 Mar 2006, 11:25
Postovi: 898
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.

_________________
U raju je lijepo, ali u paklu je raja.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 30 Mar 2007, 08:49 
OffLine
Početnik
Početnik

Pridružio se: 04 Nov 2004, 11:21
Postovi: 79
Zna sabirati. Problem ti je u konverziji u int.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 01 Apr 2007, 12:51 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
Eto šta pascal učini od čovjeka 8)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 01 Apr 2007, 13:56 
OffLine
Majstor
Majstor
Korisnikov avatar

Pridružio se: 28 Mar 2006, 11:25
Postovi: 898
Svedno ima gresku koja me je ubila u pojam.

_________________
U raju je lijepo, ali u paklu je raja.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 02:02 
OffLine
Veteran
Veteran

Pridružio se: 12 Jul 2001, 01:00
Postovi: 3131
Lokacija: Kod roditelja
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".

_________________
"I'd take the awe of understanding over the awe of ignorance any day."
- Douglas Adams


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 06:46 
OffLine
Pripravnik
Pripravnik
Korisnikov avatar

Pridružio se: 23 Dec 2006, 20:47
Postovi: 101
Lokacija: BN
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...

_________________
Pretpostavka: Ljudi ne bi trebalo da rade, vec da se zezaju.
Dokaz: Majmun se citav zivot zezao i od njega je postao covjek!
:)
Nikad ne zavrsim potpis do kr


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 07:58 
OffLine
Početnik
Početnik

Pridružio se: 04 Nov 2004, 11:21
Postovi: 79
Tacno, vraca double sto znaci da treba izbaciti one koverzije u int sto opet znaci da kompajler nema gresku.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 10:17 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
Ljudi bas ne znate :P

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 ...


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 17:45 
OffLine
Pripravnik
Pripravnik
Korisnikov avatar

Pridružio se: 23 Dec 2006, 20:47
Postovi: 101
Lokacija: BN
che.guevara je napisao:
Ljudi bas ne znate :P


Tvoje objasnjenje je na mjestu, ali ipak ne obrazlaze resenje problema.

Sta predlazes sem (moje) gore navedene korekcije?

_________________
Pretpostavka: Ljudi ne bi trebalo da rade, vec da se zezaju.
Dokaz: Majmun se citav zivot zezao i od njega je postao covjek!
:)
Nikad ne zavrsim potpis do kr


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 02 Apr 2007, 19:15 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ;)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 03 Apr 2007, 21:31 
OffLine
Pripravnik
Pripravnik

Pridružio se: 05 Mar 2007, 23:41
Postovi: 118
Lokacija: Бањалука, Република Српска
che.guevara je napisao:
Ljudi bas ne znate :P

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();
}


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Apr 2007, 03:59 
OffLine
Početnik
Početnik
Korisnikov avatar

Pridružio se: 02 Apr 2007, 13:29
Postovi: 25
Lokacija: Wien
che.guevara je napisao:
Ljudi bas ne znate :P

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.

_________________
The Convenient Solution
http://www.youtube.com/watch?v=xfzVQwW_8Jk


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Apr 2007, 19:26 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
salex je napisao:
che.guevara je napisao:
Ljudi bas ne znate :P

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 ;)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Apr 2007, 19:31 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 8)

:roll: :roll: :roll:


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Apr 2007, 20:42 
OffLine
Početnik
Početnik

Pridružio se: 15 Avg 2006, 22:48
Postovi: 65
Lokacija: Sipovo, Republika Srpska
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.

_________________
Mladost neopravdava besvest.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 09 Apr 2007, 11:20 
OffLine
Pripravnik
Pripravnik
Korisnikov avatar

Pridružio se: 23 Dec 2006, 20:47
Postovi: 101
Lokacija: BN
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 8)

:roll: :roll: :roll:



Sta nije tako? Zar nisam u pravu kad kazem da je vrijednost funkcije double?

_________________
Pretpostavka: Ljudi ne bi trebalo da rade, vec da se zezaju.
Dokaz: Majmun se citav zivot zezao i od njega je postao covjek!
:)
Nikad ne zavrsim potpis do kr


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 09 Apr 2007, 14:36 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 8)

:roll: :roll: :roll:



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 :lol: :lol: :lol:


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 09 Apr 2007, 23:42 
OffLine
Početnik
Početnik
Korisnikov avatar

Pridružio se: 02 Apr 2007, 13:29
Postovi: 25
Lokacija: Wien
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..... :D :D :D

_________________
The Convenient Solution
http://www.youtube.com/watch?v=xfzVQwW_8Jk


Vrh
 Profil  
 
Prikaži postove u poslednjih:  Poređaj po  
Započni novu temu Odgovori na temu  [ 40 Posta ]  Idi na stranicu 1, 2  Sledeća

Sva vremena su u UTC [ DST ]


Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 3 gostiju


Ne možete postavljati nove teme u ovom forumu
Ne možete odgovarati na teme u ovom forumu
Ne možete monjati vaše postove u ovom forumu
Ne možete brisati vaše postove u ovom forumu
Ne možete slati prikačene fajlove u ovom forumu

Pronađi:
Idi na:  
Powered by phpBB® Forum Software © phpBB Group
Hosting BitLab
Prevod - www.CyberCom.rs