ความแตกต่างอย่างมาก
ในฐานะที่เป็นชื่อที่แสดงถึงการdouble
มี 2x ความแม่นยำของ[1] โดยทั่วไป a มีความแม่นยำ 15 หลักทศนิยมในขณะที่มี 7float
double
float
นี่คือวิธีคำนวณจำนวนตัวเลข:
double
มี 52 mantissa บิต + 1 บิตที่ซ่อน: บันทึก (2 53 ) ÷บันทึก (10) = 15.95 หลัก
float
มี 23 mantissa บิต + 1 บิตที่ซ่อน: บันทึก (2 24 ) ÷บันทึก (10) = 7.22 หลัก
การสูญเสียความแม่นยำนี้อาจนำไปสู่ข้อผิดพลาดที่ถูกตัดทอนมากขึ้นเมื่อมีการคำนวณซ้ำเช่น
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
ในขณะที่
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
นอกจากนี้ค่าสูงสุดของการลอยคือประมาณ3e38
แต่เพิ่มขึ้นเป็นสองเท่า1.7e308
ดังนั้นการใช้float
สามารถกด "อนันต์" (เช่นหมายเลขจุดลอยตัวพิเศษ) ได้ง่ายกว่าdouble
สิ่งที่ง่ายเช่นการคำนวณแฟคทอเรียลของ 60
ในระหว่างการทดสอบอาจมีบางกรณีทดสอบที่มีจำนวนมากซึ่งอาจทำให้โปรแกรมของคุณล้มเหลวหากคุณใช้โฟลต
แน่นอนบางครั้งแม้double
จะไม่ถูกต้องดังนั้นบางครั้งเราจึงมีlong double
[1] (ตัวอย่างข้างต้นให้ 9.000000000000000066 บน Mac) แต่ประเภทจุดลอยตัวทั้งหมดต้องทนทุกข์จากข้อผิดพลาดในการปัดเศษดังนั้นหากความแม่นยำมีความสำคัญมาก (เช่นเงิน กำลังประมวลผล) คุณควรใช้int
หรือคลาสเศษส่วน
นอกจากนี้อย่าใช้+=
เพื่อรวมจำนวนจุดลอยตัวเนื่องจากข้อผิดพลาดจะสะสมอย่างรวดเร็ว fsum
หากคุณกำลังใช้งูหลามใช้ มิฉะนั้นพยายามที่จะดำเนินการตามขั้นตอนวิธีการบวก Kahan
[1]: ตัว C และ C ++ มาตรฐานไม่ได้ระบุตัวแทนของfloat
, และdouble
long double
เป็นไปได้ว่าทั้งสามจะถูกนำมาใช้เป็น IEEE ความแม่นยำสองเท่า อย่างไรก็ตามสำหรับสถาปัตยกรรมมากที่สุด (GCC, MSVC; x86, x64, ARM) float
เป็นแน่นอนแม่นยำเดียวจำนวนจุดลอยตัว IEEE (binary32) และdouble
เป็นคู่ที่มีความแม่นยำลอยจำนวนจุด IEEE (binary64)