[C#][Mono]double division returnt long

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gimmeabrake
  • Registratie: December 2008
  • Laatst online: 23-08 10:45
Ik ben als hobby-project bezig met het schrijven van een plotter van functies in C#, daarvoor maak ik gebruik van de meest recente versies van Mono en MonoDevelop in Linux Mint 12.

Ik ben op dit moment bezig met de code die het daadwerkelijke plotten doet, en ik kom iets behoorlijk vreemds tegen:

C#:
1
xVariable.Value = xMin + ((x / width) * xRange);


In bovenstaande code zijn xVariable.Value, xMin, x, width en xRange allemaal doubles.

Toch returnt x / width (met x = 1 en width = 600) een long: 0, zoals je kunt zien in de screenshot.
Afbeeldingslocatie: http://gerritdrost.com/nietlogisch.png

Ik heb zelf altijd geleerd dat als minstens 1 van de 2 getallen een double is, het resultaat van de deling ook een double wordt. Alleen als beiden int/long zijn, krijg je een int/long resultaat. Heb ik dit fout geleerd?

Acties:
  • 0 Henk 'm!

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

gerrymeistah schreef op maandag 21 mei 2012 @ 10:41:
Ik ben als hobby-project bezig met het schrijven van een plotter van functies in C#, daarvoor maak ik gebruik van de meest recente versies van Mono en MonoDevelop in Linux Mint 12.

Ik ben op dit moment bezig met de code die het daadwerkelijke plotten doet, en ik kom iets behoorlijk vreemds tegen:

C#:
1
xVariable.Value = xMin + ((x / width) * xRange);


In bovenstaande code zijn xVariable.Value, xMin, x, width en xRange allemaal doubles.

Toch returnt x / width (met x = 1 en width = 600) een long: 0, zoals je kunt zien in de screenshot.
[afbeelding]

Ik heb zelf altijd geleerd dat als minstens 1 van de 2 getallen een double is, het resultaat van de deling ook een double wordt. Alleen als beiden int/long zijn, krijg je een int/long resultaat. Heb ik dit fout geleerd?
Gaat het ook echt fout in de output van je programma? Misschien dat het puur een foutje is in de debugger van MonoDevelop. Ik zie in je screenshot dat x/width ook al een long oplevert wat zeer bijzonder is als je 2 doubles hebt die je deelt.

Hoe reageert het programma als je formule opdeelt in kleine stukjes?
code:
1
double t = x/width;

Wat maakt hij dan van t (zowel in je code als in de debugger)?

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 16:37

sopsop

[v] [;,,;] [v]

Even getest in .net:
Afbeeldingslocatie: http://dl.dropbox.com/u/68704927/dotnetdoubledivide.PNG

Dat lijkt me ook wel expected behaviour...

Acties:
  • 0 Henk 'm!

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

sopsop schreef op maandag 21 mei 2012 @ 10:53:
Even getest in .net:
[afbeelding]

Dat lijkt me ook wel expected behaviour...
Had ook niet anders verwacht hoor :) Daarom vermoed ik nog steeds dat MonoDevelop ergens een fout maakt. Vraag me daarom ook af of de waarde in zijn code niet alsnog goed gevuld wordt maar dat alleen de debugger/watch een fout maakt...

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


Acties:
  • 0 Henk 'm!

  • Gimmeabrake
  • Registratie: December 2008
  • Laatst online: 23-08 10:45
.Gertjan. schreef op maandag 21 mei 2012 @ 11:01:
[...]

Had ook niet anders verwacht hoor :) Daarom vermoed ik nog steeds dat MonoDevelop ergens een fout maakt. Vraag me daarom ook af of de waarde in zijn code niet alsnog goed gevuld wordt maar dat alleen de debugger/watch een fout maakt...
Thanks, je hebt gewoon gelijk. 8)7 Mijn vertrouwen in IDE's is schijnbaar iets te groot :P Ik kreeg bij de functie f(x) = y een horizontale lijn, dus toen ik dit bij het debuggen tegenkwam, ging ik ervan uit dat dit ook het probleem was. Schijnbaar zit er nog een bug in mijn code, want als ik de waarde in de console pleur komt er gewoon netjes het gewenste getal uit.