Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
aatomik
HV kasutaja

liitunud: 30.11.2005
|
14.09.2008 12:46:30
Java's counteri automaatne muutmine |
|
|
Lihtsalt selgitades oleks vaja teha nii, et tsükli abil väljastatakse nubreid, mis muutuvad sammuga 0.1 + 0.2 + 0.1 + 0.2 jne. Proovisin mitut varianti, aga kas viga varajases pühapäeva hommikus vms, igal juhul tööle pole asja veel saanud. Mis oleks kõige lihtsam viis selle probleemi lahendamiseks?
Näitlik koodijupp, kus andmed väljastatakse sammuga 0.1:
java:
|
public class example { public static void main (String[] args ) { double x; double counter = 0.1; for (x = 10; x > 0; x -= counter) { System. out. println("x väärtus on: " + x + "\ncounter väärtus on: " + counter ); } } }
|
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
14 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.09.2008 13:08:48
|
|
|
Kui probleem on põhimõtteline, siis tee sedasi kuigi süntaks ei pruugi javas nii käia. Pole javaga kokku puutunud.
public class example {
public static void main(String[] args) {
double x;
double counter = 0.1;
for (x = 10; x > 0; x -= counter) {
System.out.println("x väärtus on: " + x + "\ncounter väärtus on: " + counter);
if(counter<0.3){counter=counter+0.1;}
if(counter==0.3){counter=0.1;}
}
}
} |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
aatomik
HV kasutaja

liitunud: 30.11.2005
|
14.09.2008 13:23:04
|
|
|
Sellisel juhul suureneb counter 0.1 --> 0.2 --> 0.3 ja siis jääbki 0.3 juurde. Vaja aga oleks 0.1 --> 0.2 --> 0.1 --> 0.2 meetodil muutuvat counterit. Ise hakkasin ka if ja else if abil asjaga mängima, aga veel pole lahenduseni jõudnud.
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
14 |
|
tagasi üles |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
14.09.2008 13:54:41
|
|
|
kui counter on 0.1, siis muudad 0.2'ks, muudel juhtudel 0.1'ks. nüüd tõlgi see javasse ja töötab
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
14.09.2008 13:58:25
|
|
|
Või siis kasutusele võtta üks lisamuutuja (boolean) ja seda kontrollida.
Kui see on true siis lahutab 0.2 kui mitte siis 0.1. Ja seda muutujat muudad igal iteratsioonil.
Kolmas variant oleks integer counteri kasutamine ja kahega jagamise jääki (moodulit) kontrollida.
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
14.09.2008 14:30:26
|
|
|
andrusny kirjutas: |
Kui probleem on põhimõtteline, siis tee sedasi kuigi süntaks ei pruugi javas nii käia. Pole javaga kokku puutunud.
public class example {
public static void main(String[] args) {
double x;
double counter = 0.1;
for (x = 10; x > 0; x -= counter) {
System.out.println("x väärtus on: " + x + "\ncounter väärtus on: " + counter);
if(counter<0.3){counter=counter+0.1;}
if(counter==0.3){counter=0.1;}
}
}
} |
|
Selle näite viga on selles, et reaalarvud ei ole täpsed.
counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.09.2008 14:44:43
|
|
|
tsitaat: |
counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01 |
Kuidas ta saab olla o,299 kui ma ju liidan juurde 0.1+0.1 ?? Kui ta läheb suuremaks võid ju panna if(counter>=0.3){counter=0.1;}
tsitaat: |
Sellisel juhul suureneb counter 0.1 --> 0.2 --> 0.3 ja siis jääbki 0.3 juurde |
Kas proovisid? Teine if peaks ju sel juhu, kui counter==0.3 selle ju muutma uuesti 0.1
Nagu juba ütlesin, siis võimalik, et see lahendus ei sobi Javale, kuid php, Qbasicus ja veel mõnes keeles, mida olen kasutanud selline asi täiesti toimib.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
14.09.2008 14:51:42
|
|
|
andrusny kirjutas: |
tsitaat: |
counteri väärtus ei pruugi olla täpselt 0.3 vaid näiteks 0.29999... või 0.3000...01 |
Kuidas ta saab olla o,299 kui ma ju liidan juurde 0.1+0.1 ?? Kui ta läheb suuremaks võid ju panna if(counter>=0.3){counter=0.1;}
|
float ja double väärtused on tegelikult kahendsüsteemi murdarvud ja need ei teisendu üks-ühele kümnendsüsteemi.
ehk tsükkel
double i = 0;
while (i != 1) {
i += 0.1;
}
ei lõppe kunagi ära, kuna i väärtuseks ei saa kunagi täpselt 1.000(0)
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.09.2008 14:57:45
|
|
|
Tundub jah nii, tegin katseks jupi koodi JS ja tegi täpselt nii nagu öeldi, 0.1 0.2 ja 0.30004
Lahenduseks pakun sellist varianti. 10 korrutasin, kuna JS Math.round teisendab täisarvuks.
if(counter<0.3){counter=counter+0.1;}
if(Math.round(counter*10)==3){counter=0.1;} |
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
14.09.2008 15:02:43
|
|
|
Või siis nii:
if(counter<0.25){counter=counter+0.1;}
if(counter>0.25){counter=0.1;}
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
aatomik
HV kasutaja

liitunud: 30.11.2005
|
14.09.2008 15:21:32
|
|
|
DoS kirjutas: |
kui counter on 0.1, siis muudad 0.2'ks, muudel juhtudel 0.1'ks. nüüd tõlgi see javasse ja töötab |
Tegelikult asi niivõrd lihtne oligi Viga jah ilmselt unises pühapäeva hommikus - käisin hingasin pisut värsket õhku, sõin kõhu täis ja sain valmis järgmise asjaga:
java:
|
public class proov { public static void main (String[] args ) { double x; double y; double counter = 0.01; for (x = 10; x > 0; x -= counter) { y = x + 1; System. out. println("y on: " + y ); System. out. println("counter on: " + counter ); if (counter == 0.01) { counter = 0.02; } else if (counter == 0.02) { counter = 0.01; } } } }
|
Tänud kõigile, kes pühapäevasel päeval pisut mõttetööd viitsisid arendada
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
14 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
14.09.2008 15:43:12
|
|
|
Ma oleks sulle sellist varianti korra soovitanud, kuid hakkasin vaatama, et kui counter on 0.1 saab ta 0.2 ja järgmine vaatab, et kui on 0.2 saab uuesti 0.1
See on siis kui oleksid mõlemad if laused, kuid ma ei tulnud selle pealegi, et kui teine teha else if selline asi töötab. Tore.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
guest1902
Kreisi kasutaja

liitunud: 05.11.2005
|
14.09.2008 17:53:33
|
|
|
aatomik, sul mingi kala sees. Väike osa keset väljundit:
Spoiler 
...
x on 3.000000000000008
counter on 0.2
x on 2.900000000000008
counter on 0.1
x on 2.700000000000008
....
Minu väga robustne lahendus:
java:
|
public class Kaunter{ public static void main (String[] args ){ double x, counter; for(x=10, counter=0.1; x>=0.1; x-=counter){ counter=(counter==0.1)?0.2:0.1; "\ncounter on nüüd "+counter+"\n---"); } System. out. println("Ei lähe negatiivseks - piirdun nulliga"); } }
|
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
14.09.2008 20:48:57
|
|
|
Panen oma variandi ka, kus on võimalikult vähe võrdlusi ebatäpsete arvude vahel.
java:
|
public class Counter { public static void main (String[] args ) { double x = 10.0; boolean f = false; while (x > 0.0) { x -= f ? 0.2 : 0.1; f = !f; } } }
|
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
aatomik
HV kasutaja

liitunud: 30.11.2005
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
14 |
|
tagasi üles |
|
 |
Nitro
HV kasutaja

liitunud: 02.03.2004
|
17.09.2008 10:28:55
|
|
|
Saab ka nii, et paned mingi counteri lugema, mitmendat korda loop jookseb:
int counter=0;
double samm;
while (tingimus) {
if (counter%2==0) //kui on paaris arv
samm=0.1;
else
samm=0.2;
counter++;
} |
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
|