Als je echt 100% precisie wilt, moet je Decimals gebruiken.
https://fgheysels.github.io/
dus Math.Round(c, 1);
Dit is zelfs wetenschappelijk verantwoord
[ Voor 20% gewijzigd door BasieP op 29-08-2007 12:38 ]
This message was sent on 100% recyclable electrons.
Maar, waarom zou je het zo willen doen ? Gewoon decimals gebruiken; ben je van het probleem af, en je hebt dan zowiezo geen kans op fouten, want dergelijke fouten kunnen wel eens heel vervelend zijn in de financiele wereld bv.
https://fgheysels.github.io/
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Doubles zijn best precies. Althans, ik vind 16 significante cijfers best precies.BasieP schreef op woensdag 29 augustus 2007 @ 12:29:
floating-point values
die dingen zijn nou eenmaal niet precies
zie hier
Ook Decimals zijn niet 100% precies hoorwhoami schreef op woensdag 29 augustus 2007 @ 12:32:
Wat BasieP zegt.
Als je echt 100% precisie wilt, moet je Decimals gebruiken.
[ Voor 5% gewijzigd door .oisyn op 29-08-2007 13:15 ]
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.
Niet gedacht dat dit zo'n populair onderwerp was :-).
Decimals gebruiken lijkt me een beetje onzinnig aangezien het hier gaat om meters in de offshore industrie. Een lasser ziet je aankomen met een maat met 20 cijfers achter de komma :-)
Aangezien er niet iteratief gerekend wordt ga ik voor afronding op mm. Dank voor de hulp!
misschien is 'precies' niet het juiste woord, en is 'exact' beter..oisyn schreef op woensdag 29 augustus 2007 @ 13:10:
[...]
Doubles zijn best precies. Althans, ik vind 16 significante cijfers best precies.
De TS heeft twee exacte getallen (9.3 en 8.535) en trekt deze van elkaar af.
Hier zou een exact getal uit _moeten_ komen. (immers hier is wiskundig niks vreemds aan)
Doordat het opgeslagen is in een double treed er alleen allerlei rare dingen op, waardoor het resultaat niet meer exact is.
dan kan je leuk 16 significante cijfers hebben, maar als je bij 3 cijfers achter de komma al fouten maakt vind ik ze niet precies
een decimal maakt geen fouten wanneer je netjes in zijn bereik blijft. (wat een double wel doet)Ook Decimals zijn niet 100% precies hoor. Het verschil tussen een Decimal en een Double is dat de eerste werkt in base-10, en de laatste in base-2. Aangezien we het decimale talstelsel gewend zijn is een Decimal wat handiger om getallen als 9.3 en 8.535 in op te slaan. Maar ook een Decimal kan een getal als 1/3 of pi niet precies opslaan. Een Decimal heeft trouwens 28 significante cijfers, en is daarmee wel preciezer dan een double.
Dat wordt er bedoelt met '100% precies'.
This message was sent on 100% recyclable electrons.
Wat bedoel je met fouten?BasieP schreef op woensdag 29 augustus 2007 @ 13:29:
[...]
een decimal maakt geen fouten wanneer je netjes in zijn bereik blijft. (wat een double wel doet)
Dat wordt er bedoelt met '100% precies'.
als je 1 gedeeld door 3 doet met decimals heb je ook afrondingsfouten. Het voordeel met decimals is dat de opslag overeenkomt met de representatie die je in de taal gebruikt. Het lijkt daardoor dat er minder fouten op treden.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Misschien bedoelt BasieP niet Decimal (wat dat type in C# precies is weet ik niet), maar het equivalent van het type met oneindige precisie, dat in vrijwel iedere taal bestaat?
@topicstarter:
is de link van BasieP duidelijk? Anders moet je even Googlen; er zijn legio pagina's waar het op een eenvoudige manier wordt uitgelegd. In ieder geval is hetgeen je ziet normaal
[ Voor 23% gewijzigd door Confusion op 29-08-2007 13:37 ]
Wie trösten wir uns, die Mörder aller Mörder?
1/3 is een deling met een oneindige reeks cijfers achter de komma. Deze wordt afgerond op het einde van het bereik van je variable. Dit gebeurd met je simpele 2,50 rekenmachine ook.rwb schreef op woensdag 29 augustus 2007 @ 13:33:
[...]
Wat bedoel je met fouten?
als je 1 gedeeld door 3 doet met decimals heb je ook afrondingsfouten. Het voordeel met decimals is dat de opslag overeenkomt met de representatie die je in de taal gebruikt. Het lijkt daardoor dat er minder fouten op treden.
Echter bij het aftrekken van twee getallen doet mijn 2,50 rekenmachine echt niet 0000000001 achter de berekening zetten.
Dat bedoel ik met fouten.
Tuurlijk is het technisch te verklaren, maar dat wil nog niet zeggen dat het 'goed' is. als je een bereik hebt van 16 cijfers en na 3 decimalen een 'fout' maakt dan mag je toch wel stellen dat een double niet precies is (zoals ik dus in mijn eerste reactie deed)
ja een string tochConfusion schreef op woensdag 29 augustus 2007 @ 13:34:
Misschien bedoelt BasieP niet Decimal (wat dat type in C# precies is weet ik niet), maar het equivalent van het type met oneindige precisie, dat in vrijwel iedere taal bestaat?
[ Voor 14% gewijzigd door BasieP op 29-08-2007 13:39 ]
This message was sent on 100% recyclable electrons.
Je vergist je. Je neemt het decimale stelsel aan voor de absolute waarheid en zegt vervolgens dat het binaire stelsel gebrekkig is. Dit is niet waar. Het decimale stelsel is net zo gebrekkig als het binaire stelsel.BasieP schreef op woensdag 29 augustus 2007 @ 13:38:
[...]
1/3 is een deling met een oneindige reeks cijfers achter de komma. Deze wordt afgerond op het einde van het bereik van je variable. Dit gebeurd met je simpele 2,50 rekenmachine ook.
Echter bij het aftrekken van twee getallen doet mijn 2,50 rekenmachine echt niet 0000000001 achter de berekening zetten.
Dat bedoel ik met fouten.
Tuurlijk is het technisch te verklaren, maar dat wil nog niet zeggen dat het 'goed' is. als je een bereik hebt van 16 cijfers en na 3 decimalen een 'fout' maakt dan mag je toch wel stellen dat een double niet precies is (zoals ik dus in mijn eerste reactie deed)
Die afwijking van 0000000001 is misschien wel een 'fout', maar dat is net zo'n fout als het uitschrijven van 1/3 en ergens ophouden.
[ Voor 6% gewijzigd door Janoz op 29-08-2007 13:49 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Uit 1/3 komt ook een exact getalBasieP schreef op woensdag 29 augustus 2007 @ 13:29:
[...]
misschien is 'precies' niet het juiste woord, en is 'exact' beter.
De TS heeft twee exacte getallen (9.3 en 8.535) en trekt deze van elkaar af.
Hier zou een exact getal uit _moeten_ komen. (immers hier is wiskundig niks vreemds aan)
En dat heeft niets met precisie te maken, maar met de basis waarin het wordt opgeslagen, zoals ik al zei. Een Decimal werkt met basis 10, wat voor ons mensen handiger werkt, en waarin getallen als 9.3 exact zijn op te slaan. Een double werkt echter met basis 2, en het getal 9.3 is niet met een eindig aantal digits in basis 2 te representeren, net zoals 1/3 dat niet is in basis 10 (en basis 2 for that matter). Als je een basis 3 datatype zou hebben, dan zou je prima 1/3 op kunnen slaan. Dat wordt dan simpelweg "0.1"Doordat het opgeslagen is in een double treed er alleen allerlei rare dingen op, waardoor het resultaat niet meer exact is.
Een decimal heeft, afgezien van z'n grotere precisie en een andere basis, exact dezelfde problemen als een double. 1/3 is wederom een mooi voorbeeld.een decimal maakt geen fouten wanneer je netjes in zijn bereik blijft. (wat een double wel doet)
Dat wordt er bedoelt met '100% precies'.
Bedoel je niet Java's BigDecimal? Volgens mij kent .Net niet zoiets.Confusion schreef op woensdag 29 augustus 2007 @ 13:34:
[...]
Misschien bedoelt BasieP niet Decimal (wat dat type in C# precies is weet ik niet), maar het equivalent van het type met oneindige precisie, dat in vrijwel iedere taal bestaat?
Wederom, hangt van je basis af.BasieP schreef op woensdag 29 augustus 2007 @ 13:38:
[...]
1/3 is een deling met een oneindige reeks cijfers achter de komma.
Oh, dus omdat het in dit ene geval, waarbij de invoer toevallig te representeren in het tientallige stelsel geen fouten maakt, maakt het hele rekenmachine geen fouten?Echter bij het aftrekken van twee getallen doet mijn 2,50 rekenmachine echt niet 0000000001 achter de berekening zetten.
Dat bedoel ik met fouten.
Nogmaals, het hangt af van je invoer. Ik zou een Decimal hier ook aanraden als je met dit soort waarden werkt, wat bijv. in de financiele wereld veel gebeurt. Echter zou ik daarmee het gebruik van doubles niet meteen afschrijven als "niet precies". Zodra je wat meer gaat doen dan optellen, aftrekken en vermenigvuldigen (zoals bijv. delen, trigonometrische functies, logaritmische functies, etc.) boeit het echt niet meer en kun je zelfs beter voor de double kiezen wegens de support van de hardware.Tuurlijk is het technisch te verklaren, maar dat wil nog niet zeggen dat het 'goed' is. als je een bereik hebt van 16 cijfers en na 3 decimalen een 'fout' maakt dan mag je toch wel stellen dat een double niet precies is (zoals ik dus in mijn eerste reactie deed)
Hier het exacte getal 2-100. Veel plezier met je decimal
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.
Je hoeft niet alle cijfers na de komma gebruiken hé, je kan perfect een decimal met 2 cijfers na de komma gebruiken / tonen.Ruben314199 schreef op woensdag 29 augustus 2007 @ 13:22:
ok jongens, bedankt.
Niet gedacht dat dit zo'n populair onderwerp was :-).
Decimals gebruiken lijkt me een beetje onzinnig aangezien het hier gaat om meters in de offshore industrie. Een lasser ziet je aankomen met een maat met 20 cijfers achter de komma :-)
https://fgheysels.github.io/
je hebt gelijk, maar dit is niet waar ik op doelde.
Ik weet hoe het verhaaltje werkt, en weet dat het aan de opslagmethode ligt.
Het enige dat ik 'verdedig' is mijn stelling dat een double niet zo precies is.
Dit is zoals jij aangeeft afhankelijk van welke basis je gebruikt, echter gebruiken wij in deze wereld vooral het decimale stelsel, de topic starter gebruikt het decimale stelsel, en guess what: de input in jouw programmeer omgeving gebruikt het decimale stelsel.
Excuus dat ik niet mijn stelling door een advocaat heb laten opstellen en netjes heb laten inpakken door de vele voorwaardes waaraan voldaan moet worden, maar ik hoopte dat ik er toch wel vanuit mag gaan dat we in het topic over het 10-tallig stelsel zouden praten.. (dat was tenminste de gedachte bij mijn eerste post)
This message was sent on 100% recyclable electrons.
https://fgheysels.github.io/
precies!whoami schreef op woensdag 29 augustus 2007 @ 14:08:
Je bedoelt exact, aangezien precies slaat op het aantal decimalen die kunnen gebruikt worden.
This message was sent on 100% recyclable electrons.
En daarbij mijn kanttekening dat jouw definitie van precies dan niet de juiste isBasieP schreef op woensdag 29 augustus 2007 @ 14:01:
Het enige dat ik 'verdedig' is mijn stelling dat een double niet zo precies is.
En wat ik probeer duidelijk te maken is dat jouw definitie van "precisie" in het decimale stelsel ophoudt zodra je er wat verder mee gaat rekenen, zoals eveneens in deze wereld gebruikelijk is. Natuurlijk, als je je vasthoudt aan optellen, aftrekken en vermenigvuldigen zul je zelden tegen problemen aanlopen, en veel delingen kunnen ook nog wel. Maar als je al iets verder gaat loop je met een Decimal tegen dezelfde tekortkomingen aan als met een double. Denk aan het berekenen van de afstand tussen twee punten (wellicht geen vreemde operatie voor de topicstarter in de applicatie waar hij mee bezig is). En daar houdt het "voordeel" van een decimal tov een double toch echt opDit is zoals jij aangeeft afhankelijk van welke basis je gebruikt, echter gebruiken wij in deze wereld vooral het decimale stelsel, de topic starter gebruikt het decimale stelsel, en guess what: de input in jouw programmeer omgeving gebruikt het decimale stelsel.
Ach kom op zeg.Excuus dat ik niet mijn stelling door een advocaat heb laten opstellen en netjes heb laten inpakken door de vele voorwaardes waaraan voldaan moet worden, maar ik hoopte dat ik er toch wel vanuit mag gaan dat we in het topic over het 10-tallig stelsel zouden praten.. (dat was tenminste de gedachte bij mijn eerste post)
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.
Tenzij je zoveel manipulaties met doubles gaat doen dat de cumulatieve afrondfout groot genoeg kan worden om binnen de gewenste significantie van je eindresultaat te vallen.Ruben314199 schreef op woensdag 29 augustus 2007 @ 13:22:
Decimals gebruiken lijkt me een beetje onzinnig aangezien het hier gaat om meters in de offshore industrie.
Wie trösten wir uns, die Mörder aller Mörder?
* YakuzA fluit en wijst naar de eerste generatie's anti-scud raket afweergeschutConfusion schreef op woensdag 29 augustus 2007 @ 15:30:
[...]
Tenzij je zoveel manipulaties met doubles gaat doen dat de cumulatieve afrondfout groot genoeg kan worden om binnen de gewenste significantie van je eindresultaat te vallen.
Death smiles at us all, all a man can do is smile back.
PSN
Hoewel het in dat geval niet eens een opeenstapeling van meerdere afrondfouten was:YakuzA schreef op woensdag 29 augustus 2007 @ 15:48:
[...]
* YakuzA fluit en wijst naar de eerste generatie's anti-scud raket afweergeschut
http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html
Wie trösten wir uns, die Mörder aller Mörder?