In mijn programmeerervaring moet ik vaak een beslissing nemen of ik float of double moet gebruiken voor mijn real nummers. Soms ga ik voor float, soms voor dubbel, maar dit voelt echt subjectiever. Als ik zou worden geconfronteerd om mijn beslissing te verdedigen, zou ik waarschijnlijk geen deugdelijke redenen geven.

Wanneer gebruik je float en wanneer gebruik je dubbel? Gebruik je altijd dubbel, alleen als er geheugenbeperkingen aanwezig zijn, ga je voor float? Of gebruik je altijd float, tenzij de precisie vereist dat je dubbel gebruikt? Zijn er enkele substantiële verschillen met betrekking tot de computationele complexiteit van elementaire rekenkunde tussen float en double? Wat zijn de voor- en nadelen van het gebruik van float of double? En heb je zelfs een lange dubbele gebruikt?

Reacties

  • In veel gevallen wil je geen van beide gebruiken, maar eerder een decimaal type met zwevende of vaste komma. Binaire typen met drijvende komma kunnen ‘ t de meeste decimalen precies vertegenwoordigen.
  • Gerelateerd aan Wat veroorzaakt fouten bij het afronden van drijvende komma ? . @CodesInChaos mijn antwoord daar suggereert bronnen om u te helpen die beslissing te nemen, er is geen one-size-fits-all oplossing.
  • Wat bedoel je precies met ” decimalen “. Als u waarden als 0,01 exact moet weergeven (bijvoorbeeld voor geld), dan is (binaire) drijvende komma niet het antwoord. Als u alleen niet-gehele getallen bedoelt, is drijvende-komma waarschijnlijk ok, maar dan is ” decimalen ” niet het beste woord om te beschrijven wat je nodig hebt.
  • Aangezien (vanaf vandaag) de meeste grafische kaarten floats over doubles accepteren, gebruikt grafische programmering vaak enkele precisie.
  • Je hoeft niet ‘ t altijd een keuze hebben. Op het Arduino-platform zijn zowel double als float bijvoorbeeld gelijk aan float. U moet een add-in-bibliotheek vinden om echte dubbels te verwerken.

Answer

De standaardkeuze voor een type met drijvende komma moet double zijn. Dit is ook het type dat u krijgt met drijvende-kommagetallen zonder achtervoegsel of (in C) standaardfuncties die werken met drijvende-kommagetallen (bijv. exp, sin, etc.).

float mag alleen worden gebruikt als u met veel drijvende-kommagetallen moet werken (denk aan in de orde van duizenden of meer) en analyse van het algoritme heeft aangetoond dat het verminderde bereik en de nauwkeurigheid geen “probleem vormen.

long double kan worden gebruikt als je hebt meer bereik of nauwkeurigheid nodig dan double, en als dit dit mogelijk maakt op je doelplatform.

Samengevat float en long double moeten worden gereserveerd voor gebruik door specialisten, met double voor “alledaags” gebruik.

Opmerkingen

  • Ik zou float waarschijnlijk niet overwegen voor een paar duizend waarden, tenzij er een prestatieprobleem was met betrekking tot floating point cachin g en gegevensoverdracht. Er zijn gewoonlijk aanzienlijke kosten verbonden aan het uitvoeren van de analyse om aan te tonen dat float nauwkeurig genoeg is.
  • Als addendum, als u compatibiliteit met andere systemen nodig heeft, kan het voordelig zijn om dezelfde datatypes te gebruiken.
  • Ik ‘ d gebruik floats voor miljoenen getallen, niet voor 1000s. Ook doen sommige GPUs het beter met floats, in dat speciale geval gebruik je floats. Gebruik anders, zoals je zegt, dubbels.
  • @PatriciaShanahan – ‘ prestatieprobleem gerelateerd aan .. ‘ A goed voorbeeld is als je van plan bent om SSE2 of vergelijkbare vectorinstructies te gebruiken, je kunt 4 ops / vector in float doen (versus 2 per double), wat een aanzienlijke snelheidsverbetering kan opleveren (half zoveel bewerkingen en half zoveel data om te lezen & schrijven). Dit kan de drempel aanzienlijk verlagen waar het gebruik van drijvers aantrekkelijk wordt, en de moeite waard is om de numerieke problemen op te lossen.
  • Ik onderschrijf dit antwoord met een bijkomend advies: wanneer men werkt met RGB-waarden voor weergave, is acceptabel om float te gebruiken (en af en toe halve precisie) omdat noch het menselijk oog, noch het scherm, noch het kleursysteem zoveel precisie heeft. Dit advies is van toepassing op bijvoorbeeld OpenGL etc. Dit aanvullende advies is niet van toepassing op medische afbeeldingen, die strengere precisie-eisen stellen.

Antwoord

Er is zelden reden om float in plaats van double te gebruiken in code die op moderne computers is gericht. De extra precisie verkleint (maar elimineert niet) de kans op afrondingsfouten of andere onnauwkeurigheden die problemen veroorzaken.

De belangrijkste redenen die ik kan bedenken om float te gebruiken zijn:

  1. Je slaat grote reeksen getallen op en je moet het geheugengebruik van je programma verminderen.
  2. U richt zich op een systeem dat geen native drijvende komma met dubbele precisie ondersteunt. Tot voor kort ondersteunden veel grafische kaarten alleen enkele precisie-drijvende kommas. Ik weet zeker dat er tal van energiezuinige en embedded processors zijn die ook beperkte ondersteuning voor floating point hebben.
  3. U richt zich op hardware waarbij enkelvoudige precisie sneller is dan dubbele precisie, en uw toepassing wordt intensief gebruikt van drijvende-kommaberekeningen Op moderne Intel CPUs denk ik dat alle drijvende-kommaberekeningen met dubbele precisie worden uitgevoerd, dus je krijgt hier niets.
  4. U doet optimalisatie op laag niveau, bijvoorbeeld met behulp van speciale CPU-instructies die op meerdere getallen tegelijk werken.

Dus in feite is dubbel de manier om go tenzij je hardwarebeperkingen hebt of tenzij analyse heeft aangetoond dat het opslaan van getallen met dubbele precisie aanzienlijk bijdraagt aan het geheugengebruik.

Opmerkingen

  • ” Moderne computers ” wat betekent dat Intel x86-processors. Sommige van de machines die de Ouden gebruikten, boden perfect passende precisie met het basistype vlotter. (De CDC 6600 gebruikte een 60-bits woord, 48 bits genormaliseerde drijvende-komma-mantisse, 12 bits exponent. Dat ‘ is BIJNA wat de x86 je geeft voor dubbele precisie.)
  • @ John.R.Strohm: overeengekomen, maar C-compilers bestonden niet op CDC6600. Het was Fortran IV …
  • Door ” moderne computers ” Ik bedoel elke processor die in het afgelopen decennium is gebouwd of twee, of eigenlijk, aangezien de IEEE-standaard met drijvende komma op grote schaal werd geïmplementeerd. Ik ‘ ben me er volkomen van bewust dat er niet-x86-architecturen bestaan en had dat in gedachten met mijn antwoord – ik noemde GPUs en embedded processors, die doorgaans geen x86 zijn.
  • Dat ‘ is gewoon niet waar. SSE2 kan 4 drijvers of 2 doubles in één handeling manipuleren, AVX kan 8 drijvers of 4 doubles manipuleren, AVX-512 kan 16 drijvers of 8 doubles manipuleren. Voor elke vorm van high-performance computing, moet wiskunde op floats worden gezien als tweemaal de snelheid van dezelfde bewerkingen op dubbels op x86.
  • En het ‘ s nog erger dan dat, aangezien je twee keer zoveel drijvers in de processorcache kunt passen als je kunt met dubbelen, en geheugenlatentie is waarschijnlijk het belangrijkste knelpunt in veel programmas. Het warm houden van een hele werkende set drijvers in de cache kan letterlijk een orde van grootte sneller zijn dan het gebruik van dubbels en ze naar RAM te laten morsen.

Antwoord

Gebruik double voor al uw berekeningen en tijdelijke variabelen. Gebruik float wanneer u een reeks getallen moet onderhouden – float[] (als precisie voldoende is), en u heeft te maken met meer dan tientallen duizenden float getallen.

Veel / de meeste wiskundige functies of operatoren converteren / retourneren double, en jij niet ” ik wil de nummers terugzenden naar float voor eventuele tussenstappen.

Bijvoorbeeld als je een invoer hebt van 100.000 nummers uit een bestand of een stream en sorteer ze, plaats de cijfers in een float[].

Antwoord

Sommige platforms (ARM Cortex-M2, Cortex-M4 enz.) Ondersteunen dubbel niet (dit kan altijd worden gecontroleerd in de referentiehandleiding naar uw processor. Als er geen compilatiewaarschuwingen of -fouten zijn, betekent dit niet dat de code optimaal is. dubbel kan worden geëmuleerd .). Daarom moet u wellicht vasthouden aan int of float .

Als dat niet het geval is, zou ik dubbel gebruiken.

U kunt het beroemde artikel van D. Goldberg lezen (“Wat elke computerwetenschapper moet weten over drijvende-komma-rekenkunde”). U moet twee keer nadenken voordat u drijvende-kommaberekeningen gebruikt. De kans is groot dat ze in uw specifieke situatie helemaal niet nodig zijn.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

Opmerkingen

  • Deze vraag was een jaar geleden al redelijk goed beantwoord …maar in elk geval, ‘ zeg ik elke keer dat je ‘ dubbel gebruikt op platforms met dubbele precisie FPU-versnelling, je zou moeten gebruiken het op een ander, zelfs als dat betekent dat de compiler het moet emuleren in plaats van te profiteren van een FPU met alleen drijvende komma (merk op dat FPU ‘ s zijn ‘ is ook niet vereist op alle platforms, in feite definieert een Cortex-M4-architectuur ze als een optionele functie [was M2 een typfout?]).
  • De sleutel tot die logica is, terwijl het ‘ s ware zou moe moeten zijn van drijvende-kommaberekeningen, en het ‘ veel ” eigenaardigheden “, de aanwezigheid van FPU-ondersteuning voor dubbels zeker niet beschouwen als het gebruik van dubbels in plaats van drijvers. Floats zijn over het algemeen sneller dan dubbels en nemen minder geheugen in beslag (FPU-functies variëren). De omvang van het gebruik verhindert dat dit punt voortijdig wordt geoptimaliseerd. Evenals het feit dat dubbelen duidelijk overdreven zijn voor veel (misschien zelfs de meeste) toepassingen. Moeten de relatieve posities en afmetingen van de elementen op deze pagina echt worden berekend tot 13 decimalen?
  • Wanneer u een link naar een externe pagina of document toevoegt, kopieer dan de relevante informatie, of samenvatting, van het document tot uw antwoord. Links buiten de site hebben de neiging om na verloop van tijd te verdwijnen.

Antwoord

Voor echte problemen is de steekproefdrempel van uw gegevens zijn belangrijk bij het beantwoorden van deze vraag. Evenzo is de ruisvloer ook belangrijk. Als een van beide wordt overschreden door uw datatype-selectie, heeft het verhogen van de precisie geen voordeel.

De meeste echte samplers zijn beperkt tot 24 bit DACs. Suggereert dat 32 bits precisie bij berekeningen in de echte wereld voldoende zouden moeten zijn als de significantie 24 bits precisie is.

Dubbele precisie gaat ten koste van 2x geheugen. Daarom zou het beperken van het gebruik van doubles over floats de geheugenvoetafdruk / bandbreedte van actieve applicaties drastisch kunnen verminderen.

Answer

De keuze van welke variabele moet worden gebruikt tussen float en double hangt af van de nauwkeurigheid van de vereiste gegevens. Als een antwoord een verwaarloosbaar verschil moet hebben met het daadwerkelijke antwoord, zal het aantal vereiste decimalen veel zijn, wat betekent dat het dubbele wordt gebruikt. Float zal een deel van de decimalen afhakken, waardoor de nauwkeurigheid afneemt.

Opmerkingen

  • Dit antwoord ‘ voegt niets nieuws toe aan de vraag, en zegt niets van werkelijk nut.

Antwoord

Meestal gebruik ik het float type wanneer Ik heb niet veel precisie nodig – bijvoorbeeld voor geld – wat verkeerd is, maar dat is wat ik vroeger verkeerd deed.

Aan de andere kant gebruik ik double als ik meer precisie nodig heb, bijvoorbeeld voor complexe wiskundige algoritmen.

De C99-standaard zegt dit:

Er zijn drie typen met drijvende komma: float, double en long double. Het type double biedt minstens evenveel precisie als float, en het type long double biedt minstens evenveel precisie als dubbel. De set waarden van het type float is een subset van de set waarden van het type double; de set waarden van het type double is een subset van de set waarden van het type long double.

Ik heb , maar ik gebruik C / C ++ niet zo vaak. Meestal gebruik ik dynamisch getypte talen zoals Python, waar je je geen zorgen hoeft te maken over de typen.

Voor meer informatie over Double vs Float , zie deze vraag op SO .

Opmerkingen

  • Het gebruik van floating point voor serieuze geldberekeningen is waarschijnlijk een vergissing.
  • Float is precies het verkeerde type voor geld. Je moet de hoogst mogelijke precisie gebruiken.
  • @BartvanIngenSchenau Drijvende komma voor geld is meestal oké, binaire drijvende komma is dat niet. .Net ‘ s Decimal is bijvoorbeeld een type met drijvende komma en ‘ is meestal een goede keuze voor geldberekeningen.
  • @ChrisF Je hebt ‘ geen ” hoge precisie ” voor geld heb je exacte waarden nodig.
  • @SeanMcSomething – Eerlijk punt. Floats zijn echter nog steeds het verkeerde type en gezien de drijvende-kommatypen die in de meeste talen beschikbaar zijn, heeft u ” hoge precisie ” nodig om ” exacte waarden “.

Geef een reactie

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