Simpelt C program, fejl?

Tags:    c++ php oop

Hej

Når jeg kører nedstående program, bliver resultatet 0, og det skulle meget gerne give noget i retningen af 16,67. Hvad kan der være galt?

#include <stdio.h>

int main()

{
int A, B, Z;
float X;

A = 150;
B = 180;

Z = B - A;
X = Z / B * 100;

printf("Tallet er %f", X);
return 0;
}

[Redigeret d. 24/03-05 17:38:25 af GERT]



6 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Har ikke så meget forstand på C men er det ikke fordi du siger return 0;
Prøvede lige samme kode i Delphi. Der virkede det. Der er ikke noget der hedder float i delphi. Der hedder det double. Kunne det være det samme problem i c?

[Redigeret d. 24/03-05 17:49:35 af Jonas (Decko)]


For det første tager Jonas fejl begge steder. Float er 32-bit og double er 64-bit. I Delphi hedder det Real. Return 0 betyder at funktionen returnerer 0, hvilket betyder en normal program-lukning i denne situation.

Sådan her bør koden se ud:
Fold kodeboks ind/udKode 


Problemet opstår ved at Z/B opfattes som værende heltal, hvorfor resultatet giver 0. Bemærk at jeg har sat ".f" bagefter 100, hvilket automatisk gør det til en floating point værdi. Man kan også skrive ".0f". ".0" vil i nogle tilfælde gøre det til en double og i andre en float, og da double værdier behandles langsommere, så vil ".f" eller ".0f" være bedst.
Ved "(float)Z / (float)B" fortæller jeg compileren at den dividering skal opfattes som en floating point værdi.

1101110100010110000101000001

[Redigeret d. 24/03-05 17:58:25 af Nicolai Lyster Fersner]



Har ikke så meget forstand på C men er det ikke fordi du siger return 0;
Prøvede lige samme kode i Delphi. Der virkede det. Der er ikke noget der hedder float i delphi. Der hedder det double. Kunne det være det samme problem i c?





-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GED d- s: a--- C++ W++ w PS X+ tv+ b D G e- h! !r z--
------END GEEK CODE BLOCK------

[Redigeret d. 24/03-05 17:49:35 af Jonas (Decko)]



Pis også :P.





-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GED d- s: a--- C++ W++ w PS X+ tv+ b D G e- h! !r z--
------END GEEK CODE BLOCK------



Pis også :P.





-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GED d- s: a--- C++ W++ w PS X+ tv+ b D G e- h! !r z--
------END GEEK CODE BLOCK------


Man kan jo ikke vinde hver gang.
Men det var ellers godt forsøgt ;-)

1101110100010110000101000001



Har ikke så meget forstand på C men er det ikke fordi du siger return 0;
Prøvede lige samme kode i Delphi. Der virkede det. Der er ikke noget der hedder float i delphi. Der hedder det double. Kunne det være det samme problem i c?

[Redigeret d. 24/03-05 17:49:35 af Jonas (Decko)]


For det første tager Jonas fejl begge steder. Float er 32-bit og double er 64-bit. I Delphi hedder det Real. Return 0 betyder at funktionen returnerer 0, hvilket betyder en normal program-lukning i denne situation.

Sådan her bør koden se ud:
Fold kodeboks ind/udKode 


Problemet opstår ved at Z/B opfattes som værende heltal, hvorfor resultatet giver 0. Bemærk at jeg har sat ".f" bagefter 100, hvilket automatisk gør det til en floating point værdi. Man kan også skrive ".0f". ".0" vil i nogle tilfælde gøre det til en double og i andre en float, og da double værdier behandles langsommere, så vil ".f" eller ".0f" være bedst.
Ved "(float)Z / (float)B" fortæller jeg compileren at den dividering skal opfattes som en floating point værdi.

1101110100010110000101000001

[Redigeret d. 24/03-05 17:58:25 af Nicolai Lyster Fersner]


Nu virker det efter hensigten. Jeg viste ikke at man kunne fks. (float)Z, men man lære jo noget nyt vær dag =)



Et par pedantiske bemærkninger:

Der er mig bekendt ingen krav om at float SKAL være 32 bit og double 64 bit, det er typiske værdier, men der en intet der forhindrer kompileren i at bruge 39 bit float og 80 bit double.

På en moderne PC er float ikke hurtigere end double, tværtimod.

1.0 er en double.



t