(Obs! I den här artikeln förutsätts att läsare vet om grunderna 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-, oktala och hexadecimalt 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 av 1s och 0s, som, 1111 representerar 15 i decimal-systemet) är det meningsfullt att lära sig om de olika nummerformat 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) frestas eleverna att flytta på olika nummerformat inom samma typ (dvs., flytande punkträkning) som har viss precision och talintervall. Således tvingas de att lära sig nyanser mellan vissa typer. Två av de vanligaste datatyperna är Flyta och Dubbel, och medan de riktar sig mot samma behov (dvs.., flytande punkträkning), det finns ganska stor skillnad i deras interna representation och den övergripande effekten 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 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, t.ex., 20,123, 16,23, 10,2, etc., de är inte heltal (dvs.., 2, 5, 15, etc.), så de kräver att man beaktar fraktioner i binäret. Som de resulterande decimaltal (dvs.., 20,123, 16,23, etc.) kan inte lätt representeras med ett normalt binärt format (dvs 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å kommer felaktigheterna att vara 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 tillhandahålls i C-språk:
#inkludera
int main ()
float num1 = 1.f / 82;
float num2 = 0;
för (int i = 0; i < 738; ++i)
num2 + = num1;
printf ("% .7g \ n", num2);
dubbel num3 = 1,0 / 82;
dubbel num4 = 0;
för (int i = 0; i < 738; ++i)
num4 + = num3;
printf ("%. 15g \ n", num4);
getchar ();
Den skriver ut följande:
9.000031
8,99999999999983
Här kan du se att den svaga skillnaden i precisionen hos 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:
#inkludera
#inkludera
int main ()
float num1 = sqrt (2382719676512365.1230112312312312);
dubbel num2 = sqrt (2382719676512365.1230112312312312);
printf ("% f \ n", num1);
printf ("% f \ n", num2);
getchar ();
Det ger följande utgång:
48813108.000000
48813109.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. En sak att komma ihåg är att vissa GPUer / CPUer fungerar bättre / effektivt 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 denna fantastiska artikel (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).
Så ... i ett nötskal:
Platser där du ska använda Float:
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 kommentarfältet nedan!