Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
Postano: 22:36 sri, 30. 11. 2016 Naslov: Problem s double aritmetikom |
|
|
Pozdrav forumaši.
Imam 2 pitanja
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
2) Kolokvij 2011. Zadatak 5 (10 bodova) Napišite program koji učitava realni broj dvostruke točnosti t, znak d te cijele brojeve k, c i a.
Program treba na ekran ispisati tri linije. U prvoj liniji treba 4 puta ispisati znak d, u drugoj liniji treba u **aritmetici dvostruke
točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] **, a u trećoj liniji treba ispisati ostatak koji se dobije pri cjelobrojnom
dijeljenju izraza k-a s brojem c.
Program treba biti napisan u skladu s ANSI C standardom. Nije dozvoljeno korištenje biblioteke math.
Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?
Hvala unaprijed.
Pozdrav forumaši.
Imam 2 pitanja:
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
2) Kolokvij 2011.: Zadatak 5 (10 bodova) Napišite program koji učitava realni broj dvostruke točnosti t, znak d te cijele brojeve k, c i a.
Program treba na ekran ispisati tri linije. U prvoj liniji treba 4 puta ispisati znak d, u drugoj liniji treba u **aritmetici dvostruke
točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] **, a u trećoj liniji treba ispisati ostatak koji se dobije pri cjelobrojnom
dijeljenju izraza k-a s brojem c.
Program treba biti napisan u skladu s ANSI C standardom. Nije dozvoljeno korištenje biblioteke math.
Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?
Hvala unaprijed.
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 3:16 čet, 1. 12. 2016 Naslov: Re: Problem s double aritmetikom |
|
|
[quote="krilo"]
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
[/quote]
Ne postoji, ali takav ispis nije pretjerano često koristan. Ako ti treba, nije problem napisati funkciju koja će ispisivati binarni zapis broja. Probaj sam, a ako ne ide, baci pogled ovamo: [spoiler]==========================================[code:1]
void print_binary(int n) {
int d;
if(n == 0) {
printf("0");
} else {
if(n < 0) {
printf("-");
n = -n;
}
d = 1;
while(2 * d <= n) {
d = d * 2;
}
while(d != 0) {
int digit = n / d;
printf("%d", digit);
n = n % d;
d = d / 2;
}
}
}
[/code:1][/spoiler]
[quote]2) Napišite program koji učitava realni broj dvostruke točnosti t, [...] te cijele brojeve k, c i a.
Program treba [...] u **aritmetici dvostruke točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] ** [...]
Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?
[/quote]
Treba reći programu da izračun obavi s doubleovima umjesto s intovima. To je moguće na više načina, a ja ću ovdje prezentirati samo najčitljiviji.
Ideja je "prekopirati" vrijednosti iz cjelobrojnih varijabli u floating point varijable:
[code:1]
int main(void) {
double t;
int k, c, a;
double k_dbl, c_dbl, a_dbl; /* ove varijable će nam biti korisne za izbjegavanje integer aritmetike */
double rezultat;
scanf("%g%d%d%d", &t, &k, &c, &a);
k_dbl = k;
c_dbl = c;
a_dbl = a;
rezultat = t * t * t * t * t + (k_dbl * k_dbl * k_dbl + a_dbl) / (c_dbl * c_dbl * c_dbl);
printf("%g", rezultat);
return 0;
}
[/code:1]
krilo (napisa): |
1) Postoji li u c-u neki %nešto za ispis u binarnom obliku (kao što su %x i %o za ispis u heksadecimalnom i oktalnom obliku)?
|
Ne postoji, ali takav ispis nije pretjerano često koristan. Ako ti treba, nije problem napisati funkciju koja će ispisivati binarni zapis broja. Probaj sam, a ako ne ide, baci pogled ovamo: Spoiler [hidden; click to show]: | ========================================== Kod: |
void print_binary(int n) {
int d;
if(n == 0) {
printf("0");
} else {
if(n < 0) {
printf("-");
n = -n;
}
d = 1;
while(2 * d <= n) {
d = d * 2;
}
while(d != 0) {
int digit = n / d;
printf("%d", digit);
n = n % d;
d = d / 2;
}
}
}
|
|
Citat: | 2) Napišite program koji učitava realni broj dvostruke točnosti t, [...] te cijele brojeve k, c i a.
Program treba [...] u **aritmetici dvostruke točnosti izračunati i ispisati vrijednost izraza [tex]t^5 + (k^3+a)/c^3[/tex] ** [...]
Program mi nije problem napisati, osim dijela označenog s **. Ne mogu dobiti dobre rezultate jer se izraz [tex](k^3+a)/c^3[/tex] računa pomoću integera i onda kad se zbroji s [tex]t^5[/tex] opet dobijem int (npr. za t=1, k=c=a=2), a trebam dobiti decimalni broj. Kako zaobići taj problem?
|
Treba reći programu da izračun obavi s doubleovima umjesto s intovima. To je moguće na više načina, a ja ću ovdje prezentirati samo najčitljiviji.
Ideja je "prekopirati" vrijednosti iz cjelobrojnih varijabli u floating point varijable:
Kod: |
int main(void) {
double t;
int k, c, a;
double k_dbl, c_dbl, a_dbl; /* ove varijable će nam biti korisne za izbjegavanje integer aritmetike */
double rezultat;
scanf("%g%d%d%d", &t, &k, &c, &a);
k_dbl = k;
c_dbl = c;
a_dbl = a;
rezultat = t * t * t * t * t + (k_dbl * k_dbl * k_dbl + a_dbl) / (c_dbl * c_dbl * c_dbl);
printf("%g", rezultat);
return 0;
}
|
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
Postano: 11:41 čet, 1. 12. 2016 Naslov: |
|
|
Hvala na odgovoru, sad sve radi kako treba ) Još jedno pitanje, vezano za zadaće... Treba riješiti zadatke tipa
Napišite program koji učitava tri realna broja x, y i z, te ispisuje vrijednost izraza [tex] f = m^2 + M^3 [/tex], pri čemu je m= min{x,y,z} i M = max{x,y,z}.
Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?
Hvala na odgovoru, sad sve radi kako treba Još jedno pitanje, vezano za zadaće... Treba riješiti zadatke tipa:
Napišite program koji učitava tri realna broja x, y i z, te ispisuje vrijednost izraza [tex] f = m^2 + M^3 [/tex], pri čemu je m= min{x,y,z} i M = max{x,y,z}.
Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 11:49 čet, 1. 12. 2016 Naslov: |
|
|
[quote="krilo"]
Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće?[/quote]
Nisu to baš nešto jako veliki brojevi. Možeš li zalijepiti kod ovdje za neki od tih primjera, pa da vidimo što se događa?
krilo (napisa): |
Program super radi s "normalnim" (manjim) brojevima, i ja pošaljem .c file na stranicu (tako svih 5 zadataka tog tipa), a on meni na mail vrati poruku da niti jedan program ne valja s argumentom tipa "netočno za input: 3342.7814, 9564.9266, 5550.5548". I tako za sve zadatke. Kako da ga "natjeram" da prihvaća takve monstrozitete od brojeva i je li to uopće moguće? |
Nisu to baš nešto jako veliki brojevi. Možeš li zalijepiti kod ovdje za neki od tih primjera, pa da vidimo što se događa?
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
Postano: 12:27 čet, 1. 12. 2016 Naslov: |
|
|
[code:1]#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x, y, z;
printf ("Upisi tri realna broja: ");
scanf ("%lf %lf %lf", &x, &y, &z);
double m, M;
m=x;
if (y<m) m=y;
if (z<m) m=z;
M=x;
if (y>M) M=y;
if (z>M) M=z;
double a= m*m + M*M*M;
printf ("f = m^2+M^3 = %g", a);
return 0;
}[/code:1]
Kad uvrstim problematične brojeve, izbaci rezultat 8.75085e+011 (što mi se čini da u kalkulatoru izbaci dobro).
Kod: | #include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x, y, z;
printf ("Upisi tri realna broja: ");
scanf ("%lf %lf %lf", &x, &y, &z);
double m, M;
m=x;
if (y<m) m=y;
if (z<m) m=z;
M=x;
if (y>M) M=y;
if (z>M) M=z;
double a= m*m + M*M*M;
printf ("f = m^2+M^3 = %g", a);
return 0;
} |
Kad uvrstim problematične brojeve, izbaci rezultat 8.75085e+011 (što mi se čini da u kalkulatoru izbaci dobro).
|
|
[Vrh] |
|
hendrix Forumaš(ica)
Pridružen/a: 03. 09. 2012. (15:59:06) Postovi: (92)16
|
Postano: 12:51 čet, 1. 12. 2016 Naslov: |
|
|
Davno sam rjesavao zadace iz Proga, ali sam 99% siguran da u ispisu ne smijes imati nista osim trazenog izlaza (tj. brojeva), cak mislim da to negdje i podebljano pise.
(Naknadno dodano: Vidi [url=http://degiorgi.math.hr/prog1/ku/help.php#sect04]ovdje[/url], točka 3. :D )
Dakle, makni sve ove dodatke iz prvog [tt]printf()[/tt] argumenta, ostavi samo [tt]%g[/tt] pa probaj onda.
Opcenito, ako ti na takvim algoritamski jednostavnim zadacima sve na izlazu izgleda tocno, problem ce gotovo uvijek biti u necem popratnom na sto ne obracas paznju. :)
Davno sam rjesavao zadace iz Proga, ali sam 99% siguran da u ispisu ne smijes imati nista osim trazenog izlaza (tj. brojeva), cak mislim da to negdje i podebljano pise.
(Naknadno dodano: Vidi ovdje, točka 3. )
Dakle, makni sve ove dodatke iz prvog printf() argumenta, ostavi samo %g pa probaj onda.
Opcenito, ako ti na takvim algoritamski jednostavnim zadacima sve na izlazu izgleda tocno, problem ce gotovo uvijek biti u necem popratnom na sto ne obracas paznju.
|
|
[Vrh] |
|
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
|
[Vrh] |
|
|