alos Skrevet 27. april 2005 Del Skrevet 27. april 2005 jeg driver med en kalkulator greie i c++.. det jeg ikke får til er å få ganget eller plusset med deltalt, kun hele.. dette fungerer fint: int valued1 = valuedk1 * 225; dette derimot fungerer ikke: int valued1 = valuedk1 * 2,25; og jeg skulle helst ha ganget valued1 med 2,25 ikke 225 hvordan skal jeg få det til? Lenke til kommentar
Legion Skrevet 27. april 2005 Del Skrevet 27. april 2005 du må bruke float og ikke int. int er for heltall float for desimaltall Lenke til kommentar
alos Skrevet 27. april 2005 Forfatter Del Skrevet 27. april 2005 skulle det ikke da fungere: float valued1 = valuedk1 * 2.25; da får jeg 0 når jeg regner det ut.. noen tips? Lenke til kommentar
aklla Skrevet 27. april 2005 Del Skrevet 27. april 2005 har valuedk1 noen verdi da? Lenke til kommentar
alos Skrevet 27. april 2005 Forfatter Del Skrevet 27. april 2005 int valuedk1 = atoi(m_valued1); m_valued1 er en edit box. setter jeg inn tallet 2 i edit boksen så skulle jo det da blitt ganget med 2.25 og tilslutt vist i et annet sted da.. men det kommer bare opp 0 som svar. Lenke til kommentar
alos Skrevet 27. april 2005 Forfatter Del Skrevet 27. april 2005 her er hele koden: void CDOMcalcDlg::OnCalc() { // kalkulasjons delen UpdateData(true); int valuedk1 = atoi(m_valued1); int valuedk2 = atoi(m_valued2); int valuedk3 = atoi(m_valued3); int valuedk4 = atoi(m_valued4); float valued1 = valuedk1 * 2.25; float valued2 = valuedk2 * 4.34; float valued3 = valuedk3 * 4; float valued4 = valuedk4 * 4; char OutputString[20]; wsprintf(OutputString, "%ld", valued1 + valued2 + valued3 + valued4); m_sum = OutputString; UpdateData(false); } Liten forklaring: jeg har noen edit bokser som det skal settes inn tall.. disse tallene skal kanges med forskjellige verdier og deretter legges sammen for til slutt å vises i en teks box (m_sum) Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 atoi(...) returnerer integer, prøv atof(...) i stedet Lenke til kommentar
GenericName Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) ... Endret 11. januar 2011 av Token Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 Går det ann å skrive float og som double? Hæ? Lenke til kommentar
GenericName Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) ... Endret 11. januar 2011 av Token Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) Skjønner fortsatt ikke helt hva du mener. Men forskjellen på float og double er presisjonen på tallet (antal bit som brukes til å beskrive tallet). Prøv følgende prog: #include <stdio.h> int main(){ int i; double a=10000.000001; float b=a; printf ("%10.15f %10.15f\n",a,b); return 0; } Edit: Hva som skjer med dette programmet kan variere fra plattform til plattform. Jeg kjører på AMD64 i 64 bit og da gir det resultat: 10000.000001000000339 10000.000000000000000 Mens float ikke har presisjon nok til å bevare .000001 Legg merke til at double delen bevarer .000001, men introduserer 339 i slutten. Det er fordi totallsystemet som brukes til å representere titallsystemet ikke kan gjør det nøyaktig. 0.1 er faktisk et irrasjonelt tall i totallsystemet. Prøv å endre a til 0.1, og skriv ut flere siffre hvis det er nødvendig. Hos meg gir a=0.1: 0.10000000000000000555 0.10000000149011611938 Oppløsningen på tallene er også dynamisk. For eksempel kan 1000000 representeres greit. Og 0.000000000001 kan representeres greit (men med feil fordi det er irrasjonelt). Men legger man sammen disse to tallene, så vil man sitte igjen med kun 1000000. Endret 10. mai 2005 av JBlack Lenke til kommentar
GenericName Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) ... Endret 11. januar 2011 av Token Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) Takk.Er ikke printf C? Ja, men fullt lovlig å bruke i C++ også. C++ er 99% kompatibelt med C. (Nei, jeg husker ikke hva som er ikke-kompatibelt.) Endret 10. mai 2005 av JBlack Lenke til kommentar
Zethyr Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 Første treff etter litt primitiv googling: http://msdn.microsoft.com/library/default..../reftable_1.asp Her er vel de tre nederste de som er brukt som floating point data types (flyttall -> tall med noe etter komma) Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 Jeg trodde (og tror egentlig fortsatt) at float og double etc. var systemavhengig, ettersom forskjellige CPU'er kan ha forskjellig oppløsnig på FPU'ene. Lenke til kommentar
☀ ❄ Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 På min maskin er float 4, double 8 men long double 12. For øvrig står det ikke noe om sizeof float, double eller long double i The C++ Programming Language (men det står om sizeof char, long, short, enum osv.), så dét kan vel tas som en indikasjon på at det er plattformavhengig. Lenke til kommentar
A_N_K Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 Er ikke float og double IEEE-standarder? Dvs. float: 8bits eksponent og 23bits mantisse, double: 11bits eksponent og 52bits mantisse. Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 Interessant. Jeg har googlet litt, og det finnes en standard: IEEE 754 I hvilken grad den støttes av forskjellige plattformer tør jeg ikke spekulere i. Se også: http://en.wikipedia.org/wiki/IEEE_754r Lenke til kommentar
A_N_K Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) ANSI C støtter nok IEEE skal du se. Både GCC og ICC kan se bort ifra standarden hvis du ber dem om det, og generere mer effektiv kode (80bits representasjon?). Edit: Hmm .. Jeg var kanskje litt i raskeste laget der. K&R sier at float og double er implementasjons-definert. Edit 2: Kan virke som IEEE-standarden er separat fra ANSI, og at de fleste C-kompilatorer støtter den. Når jeg tenker meg om er det mulig at Visual C++ bruker utvidet presisjon (80bit) default? Endret 10. mai 2005 av A_N_K Lenke til kommentar
JBlack Skrevet 10. mai 2005 Del Skrevet 10. mai 2005 (endret) Det er godt mulig siden intel arkitekturen har 80 bits FPU, og den antagelig vil være like rask med 80 bit som med 64 bit. Og man kan vel også anta at program skrevet med VC++ vil kun brukes på wintel. Problemet kan være ikke-reproduserbare resultat dersom man kompilerer generelle program med VC++. Uansett, tok en liten hastighetstest av float (32 bit), double (64 bit) og long double (128 bit) på tre plattformer. Resultatet tilsier at det er ingen vits i å bruke float i noe tilfelle. Det gir dårligere presisjon, og heller tregere enn raskere utførelse. All tall er kjøre-tider (i hundredels sekund. ) x86_64 AMD Athlon™ 64 Processor 3000+ float: 38 double: 21 long double: 42 i686 Intel® Pentium® 4 Mobile CPU 2.00GHz float: 1053 double: 1054 long double: 1070 sparc (ukjent frekvens) float: 1467 double: 37 long double: 249 Edit: Interesting note! P4 Mobile bruker 12 byte (96 bit) for long double, mens AMD64 og sparc bruker 16 byte (128 bit). Så P4 mobile følger ikke IEEE standarden. Dette tyder på at den egentlige presisjonen er 80bit for long double på intels 32 bits prosessorer. Endret 10. mai 2005 av JBlack Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå