drijvende-kommagetallen voor mensen die niet weten of er iets om geven wat binair is 🚢

de bescheiden meterstick 📏

een meterstick (of meterstick) is een meterstick die precies 1 meter lang is. Het zal meestal dikke markeringen op het elke 10cm, iets dunnere markeringen elke 1cm, en dunnere markeringen nog elke 1mm.

merk op dat:

  • 1m is 10 keer groter dan 10cm
  • 10cm is 10 keer groter dan 1cm
  • 1cm is 10 keer groter dan 1mm

Dit is de moeite waard uit te roepen. Deze meter stok heeft een precisie van 1mm, en de markeringen zijn ingesteld in basis 10.

Foto door William Warby, https://unsplash.com/photos/WahfNoqbYnM

Precisie vs juistheid 🏎️

Laten we definiëren twee termen hier. Nauwkeurigheid is hoe dicht een resultaat is bij de” echte waarde ” ervan. Precisie is hoe specifiek uw resultaat is. Stel dat we bijvoorbeeld de lengte van een auto zouden meten die eigenlijk 254 centimeter lang was, maar in kilometers.

zegt dat het 132 is.327521 kilometer zou zeer nauwkeurig zijn, maar ook zeer onnauwkeurig.

zeggen dat het 0 kilometer was zou zeer onnauwkeurig zijn, maar zou eigenlijk veel nauwkeuriger zijn dan de eerste waarde.

een nauwkeurig en nauwkeurig antwoord zou 0,00254 kilometer zijn.

We zullen ook de term kleinste representatieve waarde gebruiken om naar precisie te verwijzen.

Measuring Sticks ‘R Us Ltd. 🏭

stel je een bedrijf voor (“MeSticks” in het kort) Dat zijn fortuin wil maken door het produceren en verkopen van meetstokken. Het heeft twee belangrijke producten gemaakt, de vaste stok en de drijvende stok.

bij het ontwikkelen van deze sticks heeft ons bedrijf genoeg hout om de stick zo breed mogelijk te maken! Echter, wat met dure printer inkt kost deze dagen, ze zijn beperkt tot hoeveel markeringen ze kunnen afdrukken op elke stick. En ze zijn niet bereid om compromissen te sluiten op inktkwaliteit — alleen de donkerste, soepelste zwarte inkt zal gaan op hun kwaliteit linialen.

vaste Sticks 🔨

stel je voor dat ze een 1m lange stick willen bouwen. Vanwege inktbeperkingen kunnen ze exact 1000 markeringen op de liniaal zetten (zonder de nummers die erop geschreven zijn mee te tellen). Dus, als we 1m door 1000 delen, krijgen we 1mm. Ze zet een vinkje elke 1mm.

We zeggen dat de grootste representatief waarde van de stick is 1m. De kleinste weergegeven waarde is 1mm.

Als we inzoomen op de stick, zien we meer nauwkeurige metingen.

als we 36,7 cm op deze stick willen meten, is dat Voor ons helemaal geen probleem. We kunnen zien dat het 367mm is.

we hebben een precisie van 1mm, dus we kunnen 367mm gemakkelijk op deze stok.

maar wat als we iets groters willen meten, bijvoorbeeld 242cm? Onze stok is hier veel te klein voor. Dus laten we gooien het uit en krijgen een die is opgeschaald tot 10x groter!

de grotere vaste Stick

Deze nieuwe stick is 10m lang. Het aantal markeringen dat we kunnen maken op de stick blijft hetzelfde als voorheen—1000 — dus we zullen nu elke 1m, elke 10cm, en elke 1cm een mark zien. Maar we zullen niet in staat zijn om 1mm goed te meten. Het heeft nu een precisie van 1cm. De grootste representatieve waarde is 10m, en de kleinste representatieve waarde is 1cm. Omdat we het groter hebben gemaakt, en we een precisie hebben kleiner dan (of gelijk aan) 1cm, kunnen we gelukkig 242cm meten zonder probleem!

nu hebben we een grotere stick, kunnen we meten 242cm gemakkelijk.

maar we kunnen niet langer 36,7 cm meten zoals voorheen. We zijn de precisie kwijt, en kunnen alleen 36 of 37cm meten — in dit geval zouden we waarschijnlijk naar 37 afronden. We moeten echter een besluit nemen, en dat is de sleutel.

de liniaal toont 36cm en 37cm, maar 36,7 cm is nergens te vinden.

als we dat zouden willen, zouden we MeSticks kunnen vragen een andere stok te maken die nog 10x groter is, om een nog grotere waarde te meten zoals 770cm (maar niet 767cm.)

of, we kunnen er een krijgen die 10x kleiner is dan onze eerste, en iets veel kleiner meten zoals 9.4 mm. Maar als we een kleinere gebruiken, beperken we de maximale grootte die we kunnen meten.

ongeacht de grootte van de stok, MeSticks is altijd toegestaan precies 1000 markeringen op het-niet meer, niet minder.

als u deze sectie hebt gevolgd, moet u nu het kernconcept achter vaste puntnummers in de informatica begrijpen! Ongeacht hoe ze onder de motorkap worden opgeslagen, is het belangrijkste punt dit:

vaste puntnummers hebben een vaste precisie voor alle waarden, dat is relatief aan de grootste representatieve waarde.

We kunnen kiezen welk bereik van waarden we willen dekken door de grootste representatieve waarde te veranderen in een waarde die onze behoeften dekt (zonder zo groot te zijn dat we geen bruikbare precisie hebben.)

drijvende stokken 🦋

Dit zijn de leuke!

denk opnieuw aan onze originele meetstok, in al zijn glorieuze 1m lengte. Maar deze keer, laten we veranderen hoe we onze 1000 Mark besteden. In plaats van elke 1/1000e van de weg langs de liniaal een enkel merkteken te plaatsen, wat als MeSticks een merkteken maakten op afstanden steeds verder uit elkaar?

op de nieuwe liniaal kunt u twee duidelijke markeringen zien aan beide uiteinden, die “0m” en “1m”zeggen. En, zoals voorheen, kunt u merken elke 10cm, zeggen 10cm, 20cm, 30cm etc. Maar als je 36,7 cm zoekt, is het er gewoon niet. Je moet kiezen voor 30cm of 40cm. Er zijn helemaal geen markeringen tussen hen.

als je naar links kijkt, zie je dat er nog steeds markeringen zijn tussen 0cm en 10cm, met een afstand van 1 per centimeter. En, nog verder naar links, zijn er millimetermarkeringen tussen 0cm en 1cm.

maar er is meer. Als u een vergrootglas krijgt, ziet u 10 Duidelijke markeringen tussen 0mm en 1mm, gelijkmatig verdeeld. Er is geen echte wetenschappelijke naam voor deze breedte (naast gewoon 0,1 mm!), dus we noemen het een haarbreedte, want dat is hoe fijn het is.

u kunt zien dat dit aan de linkerkant blijft gebeuren, kleiner dan u kunt zien, zelfs met een microscoop.

Er zijn ook twee extra, maar ongelooflijk belangrijke details die ik wegliet met deze meter stok.

de eerste is dat het eigenlijk niet 1m lang is. Het is 100m lang, en er is een markering voor elke 1m tot 10m, en vervolgens elke 10m tot 100m.

de tweede is dat het het enige type Floating Stick MeSticks heeft besloten dat ze gaan maken. We kunnen het niet weggooien en een grotere of kleinere kopen — het is 100m, nemen of laten!

echter, er zijn nog steeds 1000 markeringen op de stok, zelfs als veel van hen zijn te klein voor ons om te zien!

onze floating point liniaal — de markeringen erop word groter als we langs de stok gaan. En het is enorm!

laten we eens kijken naar de waarden waar we het eerder over hadden.

kunnen we 36,7 cm meten? Nee dat kunnen we niet-maar we kunnen rond het naar de dichtstbijzijnde 10cm te krijgen 40cm.

kunnen we meten 242cm? Nogmaals, niet precies — we kunnen meten 2m, maar we hebben niet nodig om de stok helemaal uit te breiden om dit te doen.

770cm? Dat zal komen als 8m-opnieuw, Geen uitbreiding nodig. Nauwkeurig, maar niet precies.

we hebben ook gekeken naar 9.4 mm, wat ons vroeg om een kleinere liniaal te krijgen. Dit kan gemeten worden op onze floating point stick! Omdat het kleiner is dan 10mm, en we krijgen 1 / 10thmm (of een “haarbreedte”) precisie, Ja, we kunnen wijzen op deze waarde precies op onze stok.

we kunnen gemakkelijk 9,4 mm vinden op onze floating stick, want het is zeer nauwkeurig op kleine waarden.

kunt u het patroon hier zien?

zonder de stick uit te breiden of te verkleinen, kunnen we ofwel zeer grote getallen onnauwkeurig weergeven, ofwel zeer kleine getallen met een hogere precisie.

Dit is het sleutelidee achter drijvende-kommagetallen:

Floating point numbers trade precision at large numbers for a breder range of representable values.

Fixed vs floating 🥊

Op dit punt kunt u het gevoel hebben dat vaste precisienummers superieur zijn aan floating point — immers, kijk naar al die nuttige getallen die we niet goed konden tonen!

maar in werkelijkheid gebruikt de meeste moderne software floating point getallen in plaats van fixed point. Waarom?de eerste is ergonomie. Het is veel gemakkelijker voor een programmeur om een enkel gegevenstype, de “float”, te gebruiken om vrijwel elk nummer dat ze willen op te slaan dan het is voor hen om erachter te komen welk bereik ze de zorg over bij het gebruik van een vast punt nummer.

de tweede sleutel, die de analogie met de meter-stok moeilijk kan laten zien, is dat het bereik van waarden eigenlijk veel groter is dan je zou verwachten. Het veelgebruikte “dubbele precisie” floating point getal kan waarden vertegenwoordigen als kleine 2×10-3⁰⁰. Simpel gezegd, dat ziet er ongeveer zo uit:

en de grootste waarde is ongeveer 2×103⁰⁰ — wat er zo uitziet:

deze getallen zijn zo enorm klein en groot dat het menselijk brein ze niet goed kan begrijpen!

Dit is de magie van drijvende kommagetallen. Ze laten je onvoorstelbaar grote aantallen opslaan, op welk punt je waarschijnlijk niet echt geeft om hetzelfde niveau van precisie als waar we het eerder over hadden.

voor getallen van “menselijke grootte”, bijvoorbeeld 100cm, zouden we eigenlijk in staat zijn om zo nauwkeurig als 100.00000000000001 cm te specificeren — veel fijner dan een haarbreedte.

dit feit is de reden waarom floating point getallen over het algemeen de voorkeur hebben — er zijn maar weinig gevallen waarin de precisie die het biedt eigenlijk niet goed genoeg is voor de waarden die je probeert op te slaan.

(dat wil niet zeggen dat sommige software geen legitiem gebruik heeft voor vaste puntnummers!)

een korte opmerking over basen

u herinnert zich misschien dat ik eerder al aangaf dat onze linialen in basis 10 waren gezet. Ik zeg dit omdat binaire getallen in BASIS 2 zijn. Als zodanig, in plaats van floating point getallen veranderen precisie op punten van 1, 10, 100, 1000 zouden ze de precisie te veranderen op 1, 2, 4, 8, 16.

een interessant effect in videospellen en simulaties

veel videospellen gebruiken drijvende-kommagetallen om speler-en objectposities op te slaan. Dit werkt goed voor de meeste gevallen, maar als die afstanden groter worden, kunnen er vreemde effecten optreden!

u kunt in deze video zien hoe de originele versie van Minecraft vreemde bugs had toen de speler te ver weg van het centrum van de wereld reisde:

Dit is direct gerelateerd aan het feit dat we grote getallen niet precies kunnen opslaan met floating point getallen!

conclusie 🐮

Er is zoveel meer aan de hand over hoe vaste en drijvende komma getallen werken onder de motorkap, en ik moedig je aan om verder te leren over hen! Ze zijn fundamenteel voor hoe computers en in wezen alle moderne software werkt.

een goede follow on gids om naar te kijken is hier: https://floating-point-gui.de/

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *