Skillnad mellan flyt och dubbel - vilken ska jag använda? Skillnad mellan

Anonim

(Obs! förutsätter att läsarna känner till grunden för datavetenskap).

Många nybörjare programmerare / studenter som är inskrivna i datavetenskap frågar de vanliga frågorna som är relevanta för det specifika området inom datavetenskap som de studerar. De flesta nybörjarkurser börjar med ämnena i nummersystemet som används i moderna datorer, inklusive binär , decimal , oktal och hexadecimal < systemet. Dessa är de datornummerformat som är de interna representationerna för numeriska värden i datorer (eller miniräknare och alla andra digitala datorer). Dessa värden lagras som "gruppering av bitar".

Som vi vet datorer representerar data i uppsättningar av binära siffror (dvs i kombinationen

1s och 0s , till exempel 1111 representerar 15 i decimal systemet) är det meningsfullt att lära sig om de olika talformat som används för att representera ett dynamiskt värdeområde, eftersom de utgör de grundläggande blocken i beräkningen / talbehandlingen i någon form av operation. När nummersystemet är definierat i klassrummet (ofta dåligt), är de frestade att flytta på olika nummerformat inom samma typ (t.ex. flytande aritmetik ) som har viss precision och talintervall. Således tvingas de att lära sig nyanser mellan vissa typer. Två av de vanligaste datatyperna är Float och Double , och medan de riktar sig mot samma behov (dvs flytande aritmetik ), är det ganska viss skillnad i deras interna representation och övergripande effekt på beräkningen i programmet. Det är olyckligt att många programmerare saknar nyanser mellan Flat och Double datatyper och slutar missbruka dem på platser där de inte ska användas i första hand. Slutligen resulterar i felberäkningar i andra delar av programmet.

I den här artikeln ska jag berätta för skillnaden mellan float och dubbel med kodexemplen i C-programmeringsspråket. Låt oss börja!

Float vs Double … Vad är affären?

Float och Double är den datarrepresentation som används för den flytande punkträknaden, tänk på de decimaltal som du beräknar i matematikklassen, till exempel

20. 123 , 16. 23 , 10. 2 , etc., de är inte hela tal (dvs. 2 , 5 , 15 etc.) fraktioner i det binära. Som de resulterande decimaltal (i. E., 20. 123 , 16. 23 , etc.) kan inte enkelt representeras med ett normalt binärt format (t.ex. e., heltal). Huvudskillnaden mellan Float och Double är att den förra är den enda precisionen (32-bitars) flytpunkten, medan den senare är dubbelt precision (64-bitars) flytpunktsdatatyp. Dubbel kallas "dubbel" eftersom det är i grunden en dubbel precisionsversion av Float. Om du beräknar en stor mängd (tänk på tusentals 0 i talet), då blir felaktigheterna mindre i Double och du kommer inte att förlora mycket precision.

Det är bättre att utarbeta med hjälp av kodexemplen. Följande är operationen på Float och Double genom matematiska funktioner som finns på C-språk:

#include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

för (inti = 0; i <738; ++ i)

num2 + = num1;

printf ("%.7g n", num2);

dubbel num3 = 1. 0/82;

dubbel num4 = 0;

för (inti = 0; i <738; ++ i)

num4 + = num3;

printf ("%. 15g n", num4);

getchar ();

}

Den skriver ut följande:

9. 000.031

8. 99999999999983

Här kan du se att den svaga skillnaden i precisionen för Float och Double ger ett helt annat svar, om än Double verkar vara mer exakt än Float.

Följande är exemplet på sqrt () -funktionen i C:

#include

#include

int main () {

float num1 = sqrt (2382719676512365. 1230112312312312);

dubbel num2 = sqrt (2382719676512365. 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Den ger följande utmatning:

48813108. 000 tusen

48.813.109. 678778

Här kan du se att svaret i Double har en bättre precision.

Sammantaget är det bättre att använda Double för flytande punkträkning, eftersom flera standardmatematiska funktioner i C fungerar på dubbla och moderna datorer är extremt snabba och effektiva för dubbla flytande punktberäkningar. Detta leder till att minska behovet av att använda Float, om du inte behöver använda många flytande punkter (tänk på stora arrayer med tusentals 0-tal i siffrorna) eller du arbetar på ett system som inte stöder dubbel- precision floating point, så många GPUer, lågdrivna enheter och vissa plattformar (ARM Cortex-M2, Cortex-M4, etc.) stöder inte Double ännu, då ska du använda Float. Dessutom är det en sak att komma ihåg att vissa GPU / CPUer fungerar bättre / effektiv vid Float-bearbetning, som vid beräkningen av vektorer / matris, så du kan behöva titta i manualen / dokumentationen för hårdvaruhandbok för att bättre bestämma vilken du ska använda för en viss maskin.

Det är sällan en anledning att använda Float istället för Double i koden som riktar sig mot moderna datorer. Den extra precisionen i Double reducerar men eliminerar inte chansen att avrunda fel eller annan oriktighet som kan orsaka problem i andra delar av programmet. Många matematiska funktioner eller operatörer konverterar och returnerar Double, så du behöver inte kasta numren tillbaka till Float, eftersom det kan förlora precisionen.För en detaljerad analys av Floating-point aritmetik rekommenderar jag starkt dig att läsa den här fantastiska artikeln (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Sammanfattning

Så … i ett nötskal:

Platser där du ska använda Float:

Om du riktar in hårdvara där enkel precision är snabbare än dubbel precision.

  • Din ansökan gör stor användning av flytande aritmetik, som tusentals siffror med tusentals 0-tal.
  • Du gör en mycket låg nivå optimering. Till exempel använder du speciella CPU-instruktioner (t.ex. E, SSE, SSE2, AVX, etc.) som fungerar på flera nummer / arrays / vektorer åt gången.
Slutsats

I denna artikel har jag markerat skillnaden mellan Float och Double, och vilken som ska användas på specifika platser. Förmodligen är det bättre att använda Double på de flesta ställen blint, speciellt om du riktar in mot moderna datorer, eftersom risken för låg effektivitet på grund av användningen av dubbel flytande punkt aritmetik är mycket osannolikt. Om du har några frågor, kan du fråga i kommentarsektionen nedan!