Ĺadny brzuch
Witam po przerwie:cheesy:
Otóż nie wiem czemu ale napisany program źle liczy podana nierownosc.
I nie bardzo wiem gdzie tkwi błąd.
pzdr
Zad.
Znaleźć najmniejszą liczbę naturalną n taką, że:
1.02^n > 1000*n*n
uses WinCrt; var n:integer; w1,w2:real; begin writeln ('program sprawdza podana nierownosc'); n:=0; repeat n:=n+1; w1:=1000*n*n; w2:=exp(n*ln(102/100)); until (w2) > (w1); writeln ('Najmniejsza liczba jest :',n); end.
cytat:Crisu napisał:
Otóż nie wiem czemu ale napisany program źle liczy podana nierownosc.
I nie bardzo wiem gdzie tkwi błąd.
Dlaczego uważasz, że jest błąd i program źle liczy ?
Jeśli nie pomyliłem się przy liczeniu to program podaje prawidłową wartość -> 1052
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
kurcze no, mi non stop podaje 6 :| kompilowałeś?
cytat:Crisu napisał:
kurcze no, mi non stop podaje 6 :| kompilowałeś?
Tak - kompilowałem pod Delphi i program wyrzucił liczbę 1052.
Skoro u Ciebie program wykonuje pętlę tylko 6 razy to sprawdź sobie jakie są wartości w1 i w2 przy każdym obiegu pętli - wtedy będzie łatwiej ustalić co jest nie tak.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
uses WinCrt; var i,n,k:integer; w1,w2:real; begin writeln ('program sprawdza podana nierownosc'); n:=0; repeat n:=(n+1); w1:=1000*n*n; w2:=exp(n*ln(102/100)); writeln ('W1:',w1:2:2); writeln ('W2:',w2:2:2); until (w2) > (w1); writeln ('Najmniejsza liczba jest :',n); end.
hmm nagle przy 6 wyrażenie w1 wywala mi z minusem??
szczerze mowiac nie mam pojecia czemu? (skoro w1 i w2 są real)
Dziwnie tez wyglada to w2, liczac na kalkulatorze to przy podniesieniu do 6 potegi powinno byc 1.12 a nie 1.13:|
jakaś podpowiedz ? :)
cytat:Crisu napisał:
hmm nagle przy 6 wyrażenie w1 wywala mi z minusem??
Sprawdź dokładnie i napisz - jaką wartość ma n przed obliczeniem w1 oraz n i w1 po obliczeniu w1.
Póki co nie widzę w w1:=1000*n*n niczego co by mogło powodować taki błąd...
cytat:Dziwnie tez wyglada to w2, liczac na kalkulatorze to przy podniesieniu do 6 potegi powinno byc 1.12 a nie 1.13:|
To jest chyba w porządku - różnica prawdopodobnie wynika z zaokrąglenia, które zastosowałeś w programie.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
cytat:Oxi napisał:
Sprawdź dokładnie i napisz - jaką wartość ma n przed obliczeniem w1 oraz n i w1 po obliczeniu w1.
no więc przed n=6
n:=5
W1:= 25000 czyli ok
w2:=1.10 ok
dla n=6
w1:=-29536
w2:=1.13 czyli ok
o to Ci chodziło ?
cytat:Crisu napisał:
o to Ci chodziło ?
Tak - o to.
No to ładne kwiatki się porobiły ;)
Jakiego kompilatora uźywasz ?
Jak będę miał go pod ręką to sprawdzę to dokładniej - bo na Delphim nie ma takich problemów.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
cytat:Oxi napisał:
No to ładne kwiatki się porobiły ;)
Jakiego kompilatora uźywasz ?
Jak będę miał go pod ręką to sprawdzę to dokładniej - bo na Delphim nie ma takich problemów.
Mam nadzieje , że nie z mojej winy:P
Co do kompilatora to używam " Borland Pascal for Windows ver.7.0 "
cytat:Crisu napisał:
Co do kompilatora to używam " Borland Pascal for Windows ver.7.0 "
Niestety chyba go nie mam - więc nie mogę sprawdzić u siebie.
Ale to wygląda na błąd kompilatora (choć pewności nie mam).
Spróbuj przerobić trochę ten kod, żeby robił to samo ale "inaczej" - mi to pomogło kiedyś w Delphi przy podobnym błędzie.
Albo użyj innego kompilatora (o ile możesz).
PS.
Jakbyś rozwiązał ten problem to napisz.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
Zmiana n na real umozliwiła nieco lepsze wyliczenie...wynik 1052.
Jednak nie wiem czy jest to wynik prawidłowy..
W sumie to powinno byc bez znaczenia, bo n spokojnie moze byc liczbą stałą (mnożymy) więc nie wiem czemu nie działa na integer.
nie mam niesty mozliwosci kompilacji innym programem.
Dev-Pascal wywala mi ciągle bład.
cytat:Crisu napisał:
Zmiana n na real umozliwiła nieco lepsze wyliczenie...wynik 1052.
Jednak nie wiem czy jest to wynik prawidłowy.
To prawidłowy wynik (a przynajmniej mi tak wyszło :))
Możesz sobie ręcznie policzyć wartości dla 1051 oraz 1052 i sprawdzić jak to wygląda.
cytat:W sumie to powinno byc bez znaczenia, bo n spokojnie moze byc liczbą stałą (mnożymy) więc nie wiem czemu nie działa na integer.
No dla Integera powinno działać bez problemów (i pod Delphi działa) ale widocznie kompilator którego używasz ma inne zdanie na ten temat ;)
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
IMHO w Turbo Pascalu integer ma 4 bajty, więc może przechowywać liczby od ok -32000 do 32000. A że 1000 * 6 * 6 = 36000 to po prostu skończył się zakres i w1 się przekręciło...
Zamiast integera daj longa (czy jak to się w Pascalu zowie;) ) i powinno grać.
cytat:Kojok napisał:
IMHO w Turbo Pascalu integer ma 4 bajty, więc może przechowywać liczby od ok -32000 do 32000. A że 1000 * 6 * 6 = 36000 to po prostu skończył się zakres i w1 się przekręciło...
No mogłoby to być powodem - ale te 36000 idzie do zmiennej real, która bez problemów powinna to zmieścić. No chyba, że zanim obliczona wartość zostanie przypisana do w1 to najpierw liczona jest w integer :-k
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
no w sumie to racja . Integer przyjmuje liczby od [-32768, 32767]
zarówno z Longint i Real liczy poprawnie:)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Otóż nie wiem czemu ale napisany program źle liczy podana nierownosc.
I nie bardzo wiem gdzie tkwi błąd.
pzdr
Zad.
Znaleźć najmniejszą liczbę naturalną n taką, że:
1.02^n > 1000*n*n
uses WinCrt; var n:integer; w1,w2:real; begin writeln ('program sprawdza podana nierownosc'); n:=0; repeat n:=n+1; w1:=1000*n*n; w2:=exp(n*ln(102/100)); until (w2) > (w1); writeln ('Najmniejsza liczba jest :',n); end.
cytat:Crisu napisał:
Otóż nie wiem czemu ale napisany program źle liczy podana nierownosc.
I nie bardzo wiem gdzie tkwi błąd.
Dlaczego uważasz, że jest błąd i program źle liczy ?
Jeśli nie pomyliłem się przy liczeniu to program podaje prawidłową wartość -> 1052
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
kurcze no, mi non stop podaje 6 :| kompilowałeś?
cytat:Crisu napisał:
kurcze no, mi non stop podaje 6 :| kompilowałeś?
Tak - kompilowałem pod Delphi i program wyrzucił liczbę 1052.
Skoro u Ciebie program wykonuje pętlę tylko 6 razy to sprawdź sobie jakie są wartości w1 i w2 przy każdym obiegu pętli - wtedy będzie łatwiej ustalić co jest nie tak.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
uses WinCrt; var i,n,k:integer; w1,w2:real; begin writeln ('program sprawdza podana nierownosc'); n:=0; repeat n:=(n+1); w1:=1000*n*n; w2:=exp(n*ln(102/100)); writeln ('W1:',w1:2:2); writeln ('W2:',w2:2:2); until (w2) > (w1); writeln ('Najmniejsza liczba jest :',n); end.
hmm nagle przy 6 wyrażenie w1 wywala mi z minusem??
szczerze mowiac nie mam pojecia czemu? (skoro w1 i w2 są real)
Dziwnie tez wyglada to w2, liczac na kalkulatorze to przy podniesieniu do 6 potegi powinno byc 1.12 a nie 1.13:|
jakaś podpowiedz ? :)
cytat:Crisu napisał:
hmm nagle przy 6 wyrażenie w1 wywala mi z minusem??
Sprawdź dokładnie i napisz - jaką wartość ma n przed obliczeniem w1 oraz n i w1 po obliczeniu w1.
Póki co nie widzę w w1:=1000*n*n niczego co by mogło powodować taki błąd...
cytat:Dziwnie tez wyglada to w2, liczac na kalkulatorze to przy podniesieniu do 6 potegi powinno byc 1.12 a nie 1.13:|
To jest chyba w porządku - różnica prawdopodobnie wynika z zaokrąglenia, które zastosowałeś w programie.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
cytat:Oxi napisał:
Sprawdź dokładnie i napisz - jaką wartość ma n przed obliczeniem w1 oraz n i w1 po obliczeniu w1.
no więc przed n=6
n:=5
W1:= 25000 czyli ok
w2:=1.10 ok
dla n=6
w1:=-29536
w2:=1.13 czyli ok
o to Ci chodziło ?
cytat:Crisu napisał:
o to Ci chodziło ?
Tak - o to.
No to ładne kwiatki się porobiły ;)
Jakiego kompilatora uźywasz ?
Jak będę miał go pod ręką to sprawdzę to dokładniej - bo na Delphim nie ma takich problemów.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
cytat:Oxi napisał:
No to ładne kwiatki się porobiły ;)
Jakiego kompilatora uźywasz ?
Jak będę miał go pod ręką to sprawdzę to dokładniej - bo na Delphim nie ma takich problemów.
Mam nadzieje , że nie z mojej winy:P
Co do kompilatora to używam " Borland Pascal for Windows ver.7.0 "
cytat:Crisu napisał:
Co do kompilatora to używam " Borland Pascal for Windows ver.7.0 "
Niestety chyba go nie mam - więc nie mogę sprawdzić u siebie.
Ale to wygląda na błąd kompilatora (choć pewności nie mam).
Spróbuj przerobić trochę ten kod, żeby robił to samo ale "inaczej" - mi to pomogło kiedyś w Delphi przy podobnym błędzie.
Albo użyj innego kompilatora (o ile możesz).
PS.
Jakbyś rozwiązał ten problem to napisz.
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
Zmiana n na real umozliwiła nieco lepsze wyliczenie...wynik 1052.
Jednak nie wiem czy jest to wynik prawidłowy..
W sumie to powinno byc bez znaczenia, bo n spokojnie moze byc liczbą stałą (mnożymy) więc nie wiem czemu nie działa na integer.
nie mam niesty mozliwosci kompilacji innym programem.
Dev-Pascal wywala mi ciągle bład.
cytat:Crisu napisał:
Zmiana n na real umozliwiła nieco lepsze wyliczenie...wynik 1052.
Jednak nie wiem czy jest to wynik prawidłowy.
To prawidłowy wynik (a przynajmniej mi tak wyszło :))
Możesz sobie ręcznie policzyć wartości dla 1051 oraz 1052 i sprawdzić jak to wygląda.
cytat:W sumie to powinno byc bez znaczenia, bo n spokojnie moze byc liczbą stałą (mnożymy) więc nie wiem czemu nie działa na integer.
No dla Integera powinno działać bez problemów (i pod Delphi działa) ale widocznie kompilator którego używasz ma inne zdanie na ten temat ;)
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
IMHO w Turbo Pascalu integer ma 4 bajty, więc może przechowywać liczby od ok -32000 do 32000. A że 1000 * 6 * 6 = 36000 to po prostu skończył się zakres i w1 się przekręciło...
Zamiast integera daj longa (czy jak to się w Pascalu zowie;) ) i powinno grać.
cytat:Kojok napisał:
IMHO w Turbo Pascalu integer ma 4 bajty, więc może przechowywać liczby od ok -32000 do 32000. A że 1000 * 6 * 6 = 36000 to po prostu skończył się zakres i w1 się przekręciło...
No mogłoby to być powodem - ale te 36000 idzie do zmiennej real, która bez problemów powinna to zmieścić. No chyba, że zanim obliczona wartość zostanie przypisana do w1 to najpierw liczona jest w integer :-k
ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486
no w sumie to racja . Integer przyjmuje liczby od [-32768, 32767]
zarówno z Longint i Real liczy poprawnie:)