Springen naar inhoud

Delen door 0 in computerprogramma's


  • Log in om te kunnen reageren

#1

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 29 juni 2006 - 22:55

Edit TD: dit ging niet over de wiskundige substiliteit 0/0, maar over delingen door 0 in computerprogramma's. De ontstane discussie heb ik daarom afgesplitst.

In computerprogrammas kom je wel eens het probleem tegen:

100 punten door 2 spelers is 50 per speler
50 punten door 1 speler is 50 per speler
25 punten door 0 spelers is 0 per speler want er zijn geen spelers.
dus 25/0 geeft 0.

Als functie-resultaat geef ik altijd 0 bij een deling door 0.
(geen foutmelding verwerking)
In een computerspel kan men niet tegen de gebruiker zeggen dat er een deling door nul heeft plaatsgevonden tijdens een schietspel ofzo.
Gemiddelde score bij 0 keer schieten is 0 per kogel.
Een computertaal is voor mensen, niet voor de computer.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 30 juni 2006 - 09:07

Dat zal er dan toch apart geprogrammeerd zijn, want als je met de standaard wiskundige tools een deling door 0 uitvoert (zoals 25/0) krijg je geen 0 hoor.
Wellicht moet er dan iets in de aard zijn van: "if #spelers = 0, then 0 points, else *normale berekening*" (in jouw voorbeeld).
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#3

Revelation

    Revelation


  • >1k berichten
  • 2364 berichten
  • Technicus

Geplaatst op 30 juni 2006 - 12:47

Je krijgt zelfs een error als je deelt door nul: 'Floating point division by zero'.
ďQuotation is a serviceable substitute for wit.Ē - Oscar Wilde

#4

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 01 juli 2006 - 09:26

Bij ingewikkelde formulen moet je ten alle tijde een error opvang systeem hebben voor overflow en delingen door nul.
Omdat computers digitaal werken vallen in bepaalde berekeningen >0 weg tot 0.
Vooral bij integer div integer calculaties.
Want wat is 1/3 bij een integercalculatie.
0 dus.
En 100[float]/ (1[integer] div 3[integer]) is dan error.
In de wiskunde is het gewoon 300.
Maar normale getallen in computers hebben geen oneindige getalbereiken.
Bij games e.d. gebruiken ze allemaal integer getallen voor de snelheid.

Het is daarom aan de programmeur om een zo goed mogelijk logische methode voor een calculatie te vinden c.q. schrijven die stabiel en snel werkt.
Een computertaal is voor mensen, niet voor de computer.

#5

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 01 juli 2006 - 10:42

Zulke problemen heb je in computers altijd. Zelfs wanneer je met een floating point voorstelling werkt kun je reŽle getallen niet exact weergeven als ze teveel decimalen bevatten. Problemen ivm nauwkeurigheid duiken dan ook op wanneer je bijvoorbeeld twee getallen die ongeveer aan elkaar gelijk zijn van elkaar wil aftrekken.

Noot: topic afgesplitst, zie edit in eerste post
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#6

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 01 juli 2006 - 10:45

Zulke problemen heb je in computers altijd. Zelfs wanneer je met een floating point voorstelling werkt kun je reŽle getallen niet exact weergeven als ze teveel decimalen bevatten.

Sterker nog, zelfs 0.1 past al niet eens in een floating point getal :roll:
In theory, there's no difference between theory and practice. In practice, there is.

#7

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 01 juli 2006 - 10:52

Ja, je hebt zo van die 'speciale gevalletjes'.
Je zou bijna gaan denken dat computers dom zijn :roll:
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#8

CloudedHeaven

    CloudedHeaven


  • >100 berichten
  • 249 berichten
  • Ervaren gebruiker

Geplaatst op 01 juli 2006 - 14:08

6 / 6 = 1
6 / 3 = 2
6 / 2 = 3
6 / 1 = 6
6 / 0 = oneindig

Men geeft aan dat er een fout ontstaan, toch vind ik dat op zo'n moment niet op zijn plaats.

Je hebt gewoon, imo, een oneindige herhaling zonder formele programmeer structuur.
Dat is dus bekeken van uit de hogere taal zelf.

#9

Revelation

    Revelation


  • >1k berichten
  • 2364 berichten
  • Technicus

Geplaatst op 01 juli 2006 - 14:19

Tuurlijk ontstaat er een fout. De PC controleert alvorens hij gaat rekenen of er een deling door 0 wordt gedaan, doet hij dat niet gaat het al helemaal fout. Want welk getal keer 0 is 6?

6/0 = x <=>
0*x = 6

Vind jij maar eens een kloppende x! :roll:

EDIT:
in het speciale geval 0/0 is iedere x natuurlijk goed. nou ja.. of x moet gedefinieerd zijn als 6/0 :D
ďQuotation is a serviceable substitute for wit.Ē - Oscar Wilde

#10

Brinx

    Brinx


  • >1k berichten
  • 1433 berichten
  • Lorentziaan

Geplaatst op 01 juli 2006 - 15:03

Het decimale getal 0.1 is niet exact te schrijven in binaire notatie, toch? Je zou een oneindige expansie krijgen in de vorm van 0.000111etc. Dat neemt niet weg dat het in floating point notatie prima geschreven kan worden als 1E-1. Zowel de mantisse als de exponent zijn dan gehele getallen, en de representatie is exact. Het wordt pas vervelend wanneer de mantisse (of de exponent, maar dat gebeurt minder snel denk ik) niet meer in het aangewezen aantal bits past dat bij een floating-point getal hoort.

#11

CloudedHeaven

    CloudedHeaven


  • >100 berichten
  • 249 berichten
  • Ervaren gebruiker

Geplaatst op 01 juli 2006 - 20:51

6/0 = x <=>
0*x = 6

Vind jij maar eens een kloppende x! :roll:


Maar nu zeg je er is een som en die heeft een uitkomst. Daarbij ga je voorbij aan het feit dat die uitkomst op een bepaalde manier gevonden moet worden.

Bijvoorbeeld:
6 / 3 = x, om de uitkomst te bepalen moet je gaan kijken hoeveel keer 3 in 6 gaat.

6 / 0 = x misschien onzinnig, maar qua essentie is er niet mis mee er kan dus ook geen fout ontstaan omdat de som qua structuur niet afwijkt en kan er op dezelfde manier naar de uitkomst gezocht worden.

Aangezien dat oneindig is wordt er, al dan niet terecht, een foutmelding gegeven omdat je met zo'n situatie toch niets mee opschiet, althans ik heb er zelf niet iets zinnigs voor gevonden. :D

#12

TD

    TD


  • >5k berichten
  • 24049 berichten
  • VIP

Geplaatst op 01 juli 2006 - 22:07

6 / 0 = x misschien onzinnig, maar qua essentie is er niet mis mee er kan dus ook geen fout ontstaan omdat de som qua structuur niet afwijkt en kan er op dezelfde manier naar de uitkomst gezocht worden.

Wiskundig is er net wťl een verschil.
Voor de reŽle getallen is de deling a/b enkel gedefinieerd voor b verschillend van 0.
Het geval van 6/0 verschilt wiskundig dus wel degelijk van 6/x met x niet 0.

In de IEEE floating-point standaard wordt a/0 gelijkgesteld aan +oneindig voor a positief, en -oneindig voor a negatief.
Dit voorkomt dat je verplicht bent het als een apart geval te beschouwen, maar is dus wiskundig niet helemaal netjes.
"Malgré moi, l'infini me tourmente." (Alfred de Musset)

#13

Sybke

    Sybke


  • >250 berichten
  • 599 berichten
  • Ervaren gebruiker

Geplaatst op 01 juli 2006 - 22:16

25 punten door 0 spelers is 0 per speler want er zijn geen spelers.

Hoe kunnen er 25 punten worden gehaald door 0 spelers?

#14

Schwartz

    Schwartz


  • >250 berichten
  • 691 berichten
  • Verbannen

Geplaatst op 06 juli 2006 - 10:40

Een spelletje X heeft 40 punten te verdelen.
Iedere speler die wint bekomt punten uit die pot.
Bij 4 spelers is dat 10 punten
Bij 3 spelers is dat 13 punten.
Bij 2 spelers is dat 20 punten.
Bij 1 speler, joepie alles gewonnen, 40 punten.
Bij 0 spelers, niemand haalde het doel van het spel, is het 0.
========================================

Bij computerspelen e.d. ga ik er ook vanuit dat 0/0 0 is.
Ook (6/0)/(3/0)=0
(6/0)+1=1
Een computertaal is voor mensen, niet voor de computer.

#15

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 06 juli 2006 - 11:00

Mij ontgaat een beetje wat het doel is van deze thread, dus mijn volgende opmerking is misschien misplaatst.

Een spelletje X heeft 40 punten te verdelen.
Iedere speler die wint  bekomt punten uit die pot.
Bij 4 spelers is dat 10 punten
Bij 3 spelers is dat 13 punten.
Bij 2 spelers is dat 20 punten.
Bij 1 speler, joepie alles gewonnen, 40 punten.
Bij 0 spelers, niemand haalde het doel van het spel, is het 0.

Dit is logisch niet correct. Je kunt 40 punten niet verdelen over 0 spelers. Je kan natuurlijk wel je programma zo inrichten dat het bij delen door nul een bepaald getal produceert. Dit is enkel uit gemakszucht natuurlijk, want je kan net zo goed een routine schrijven die even controleert of er door nul gedeeld gaat worden.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures