[C] Berekening met double doet 't niet, met int wel..

Pagina: 1
Acties:

  • Gardocki
  • Registratie: Oktober 2000
  • Niet online
Ik ben sinds kort begonnen met C, waarmee ik nu een progje wil schrijven. Het gaat om een stukje code dat berekent hoeveel het kost om een PC 24/7 aan te laten staan. Het gaat om deze code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(void) {
    double watt;
    double kosten;
    double totaal;

    printf("aantal watt:");
    scanf("%f", &watt);
    
    printf("kosten kwh:");
    scanf("%f", &kosten);
    
    watt = 1000 / watt;
    totaal = (kosten * 4380) / watt;
    
    printf("Totaal:%f\n", totaal);
}

Hier komt altijd "0.00000" uit. Dus iets zit er fout.

Als ik alle variabelen als integer declareer (wat ik niet wil, want "kosten" moet bijvoorbeeld "0.25" als waarde hebben), dan doet m'n berekening het wel..

Kan iemand mij op weg helpen? Ik heb uiteraard al gezocht en gelezen, maar ik kom er niet uit.

They made me do it.


Verwijderd

ik ben niet zo'n c kenner maar moet je van die literals 1000 en 4380 niet 1000.0 en 4380.0 maken zodat je compiler weet dat het floating point getallen zijn?

of (double) ervoor zetten kan volgens mij ook...

[ Voor 16% gewijzigd door Verwijderd op 18-09-2004 19:32 ]


Verwijderd

je deelt door een int, verander 1000 in 1000.0 en 4380 in 4380.0

  • Gardocki
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 18 september 2004 @ 19:37:
je deelt door een int, verander 1000 in 1000.0 en 4380 in 4380.0
Er komt dan nog steeds 0.00000 uit.
Verwijderd schreef op 18 september 2004 @ 19:32:
of (double) ervoor zetten kan volgens mij ook...
Werkt ook niet..

edit: ik vul trouwens bij watt 100, en bij kosten 0.25 in..

[ Voor 8% gewijzigd door Gardocki op 18-09-2004 19:42 ]

They made me do it.


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Ik zie geen sporen van printf()-debuggen. Oftewel: output her-en-der die variabelen en check of ze kloppen :)

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Wat gebeurt er als je voor "watt" de waarde 0 in geeft?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Verwijderd schreef op 18 september 2004 @ 19:32:
ik ben niet zo'n c kenner maar moet je van die literals 1000 en 4380 niet 1000.0 en 4380.0 maken zodat je compiler weet dat het floating point getallen zijn?

of (double) ervoor zetten kan volgens mij ook...
Niet nodig.

int <operator> int heeft als result integer, dus ja dan zou je moeten casten.
Maar wat er nu gedaan wordt is int <operator> double, dat als result double heeft. Die int wordt automagisch naar double gecast, dat hoef je niet expliciet te doen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

CyBeR schreef op 18 september 2004 @ 19:49:
Ik zie geen sporen van printf()-debuggen. Oftewel: output her-en-der die variabelen en check of ze kloppen :)
Mee eens, ik heb zo het idee dat kosten 0 blijft. Wat gebeurt er als je voor kosten een geheel getal (bv 25) invult?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

double vervangen door float -> hoppa klaar

%f staat voor een float, een double is iets wezenlijk anders, en heeft %d nodig... (kort gezegd, float: 32 bits, double: 64 bits, double precision snappie ;))

[ Voor 68% gewijzigd door Verwijderd op 18-09-2004 20:16 . Reden: Uitlegje er bij :) ]


  • Gardocki
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 18 september 2004 @ 20:14:
double vervangen door float -> hoppa klaar
Hmm idd, 't werkt nu. Thnx :)
%f staat voor een float, een double is iets wezenlijk anders, en heeft %d nodig... (kort gezegd, float: 32 bits, double: 64 bits, double precision snappie ;))
Ja, half :P

Wat ik raar vind: ik heb in Java precies zo'n zelfde programma geschreven, en daar gebruik ik wél gewoon double en dat werkt gewoon. Ik weet dat je 2 talen niet mag vergelijken, maar toch..

Iig bedankt iedereen :)

They made me do it.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Verwijderd schreef op 18 september 2004 @ 20:14:
double vervangen door float -> hoppa klaar

%f staat voor een float, een double is iets wezenlijk anders, en heeft %d nodig... (kort gezegd, float: 32 bits, double: 64 bits, double precision snappie ;))
%d is integer, dus dan moet je er nog iets bij zetten. Zoals bv %ld een long int is.
Tom S. schreef op 18 september 2004 @ 20:40:
Wat ik raar vind: ik heb in Java precies zo'n zelfde programma geschreven, en daar gebruik ik wél gewoon double en dat werkt gewoon. Ik weet dat je 2 talen niet mag vergelijken, maar toch..
Andere manier van inlezen, waardoor de conversie van string naar double wel meteen goed ging. Als je een float (%f) in een double probeert in te lezen via scanf gaat dat (blijkbaar) niet goed. Als je in java het resultaat van een Float.parseFloat(String) toewijst aan een double variabele kan dat omdat een double "groter" (weet ff de correcte naam niet) is dan een double.
Zo kan je integer waarden toewijzen aan een long, float aan double, int aan float, long aan double, maar in geen van de gevallen andersom.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

IceManX schreef op 18 september 2004 @ 21:17:
[...]
%d is integer, dus dan moet je er nog iets bij zetten. Zoals bv %ld een long int is.

*knip*
Ja, je hebt helemaal gelijk. Dat krijg je denk ik van een paar maanden geen C programmeren 8)7

En daarmee heb je gelijk uitgelegd hoe je een double moet inlezen, nl met %lf voor long float. Werkt perfect.

Wat de TS trouwens ook zou kunnen overwegen is om met functies als strtod en fgets te werken. Scanf is zoals je ziet een beetje gevoelig voor fouten, en error checking is er niet echt makkelijk mee IMHO

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens een kleine aanvulling, bij een %f bij printf en consorten (dus de uitvoer ipv de invoer) maakt het niet uit of je een float of een double meegeeft als parameter, omdat floats dan automatisch gecast worden naar doubles bij functies met een variabel aantal parameters (hetzelfde gaat op voor chars, shorts en enums, die naar int geconverteert worden). Bij scanf gaat dat niet op, aangezien je een pointer naar float hebt wat niet automatisch gecast kan worden.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

.oisyn schreef op 20 september 2004 @ 14:38:
Overigens een kleine aanvulling, bij een %f bij printf en consorten (dus de uitvoer ipv de invoer) maakt het niet uit of je een float of een double meegeeft als parameter, omdat floats dan automatisch gecast worden naar doubles bij functies met een variabel aantal parameters (hetzelfde gaat op voor chars, shorts en enums, die naar int geconverteert worden).
Da's dan alleen met downwards casten, want als ik een long print zonder %ld maar met %d krijg ik een warning (en terecht).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik heb niets gezegd over longs, een long wordt gewoon gestuurd als een long. Alleen een char als een int, en een short of enum of bitfield ook. Overigens is een int en een long op de meeste platformen beide 32 bits, maar goed dat is natuurlijk niet iets waar je zomaar vanuit kunt gaan :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 20:53

Robtimus

me Robtimus no like you

Het enige waar je vanuit mag gaan is dit:
1 <= sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int) <= sizeof(long long int)

Meestal is sizeof(char) 1, sizeof(int) en sizeof(long int) 4 en sizeof(long long int) 8, maar daar mag je idd niet van uit gaan.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1