Gå til innhold

slå sammen deltall i c++


Anbefalte innlegg

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

hvordan skal jeg få det til?

Lenke til kommentar
Videoannonse
Annonse

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

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
  • 2 uker senere...

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 av JBlack
Lenke til kommentar

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

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 av A_N_K
Lenke til kommentar

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 av JBlack
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...