ความแตกต่างระหว่าง Float And Double - ที่ใดที่ฉันควรใช้? ความแตกต่างระหว่าง
(หมายเหตุ: บทความนี้ สมมติว่าผู้อ่านเข้าใจเกี่ยวกับพื้นฐานของวิทยาการคอมพิวเตอร์)
โปรแกรมเมอร์ newbie จำนวนมาก / นักเรียนที่ลงทะเบียนเรียนในวิทยาการคอมพิวเตอร์ถามคำถามที่ถามบ่อยที่เกี่ยวข้องกับสาขาวิชาเฉพาะด้านในวิทยาการคอมพิวเตอร์ที่พวกเขาเรียน หลักสูตรเริ่มต้นส่วนใหญ่จะขึ้นต้นด้วยหัวข้อต่างๆของระบบเลขที่ใช้ในคอมพิวเตอร์สมัยใหม่ ได้แก่ เลขฐานสอง , เลขฐานสิบ , octal และ hexadecimal < ระบบ ต่อไปนี้เป็นรูปแบบตัวเลขคอมพิวเตอร์ที่เป็นตัวแทนภายในของค่าตัวเลขในคอมพิวเตอร์ (หรือเครื่องคิดเลขและคอมพิวเตอร์ดิจิตอลชนิดอื่น ๆ) ค่าเหล่านี้จะถูกจัดเก็บเป็น "การจัดกลุ่มของบิต"
ตามที่เราทราบว่าคอมพิวเตอร์แสดงข้อมูลในชุดตัวเลขไบนารี (เช่นในการรวมกันของ1s และ 0s เช่น 1111 หมายถึง 15 ในระบบเลขฐานสิบ) ควรใช้รูปแบบตัวเลขที่แตกต่างกันเพื่อใช้เป็นตัวแทนของช่วงค่าแบบไดนามิกเนื่องจากทำให้เป็นส่วนพื้นฐานของการคำนวณ / การประมวลผลตัวเลข ในการดำเนินการใด ๆ เมื่อระบบตัวเลขถูกกำหนดไว้ในห้องเรียน (มักจะแย่) นักเรียนจะต้องย้ายไปยังรูปแบบตัวเลขที่ต่างกันภายในประเภทเดียวกัน (เช่นเลขประจุ เลข) ที่มีความแม่นยำและช่วงตัวเลขบางอย่าง ดังนั้นพวกเขาจึงถูกบังคับให้เรียนรู้ความแตกต่างระหว่างบางประเภท สองประเภทข้อมูลที่ใช้กันโดยทั่วไปคือ Float และ คู่ และในขณะที่เป้าหมายเหล่านี้มีความต้องการเดียวกัน (เช่น เลขคณิตลอยตัว ) มีค่อนข้างมาก ความแตกต่างบางอย่างในการแสดงภายในและผลกระทบโดยรวมต่อการคำนวณในโปรแกรม โชคร้ายที่ผู้สร้างโปรแกรมจำนวนมากพลาดความแตกต่างระหว่างประเภทข้อมูลแบบแบนและแบบคู่และทำให้ใช้งานผิดพลาดได้ในที่ที่ไม่ควรใช้ในตำแหน่งแรก ท้ายที่สุดทำให้เกิดความผิดพลาดในส่วนอื่น ๆ ของโปรแกรม ในบทความนี้ผมจะบอกความแตกต่างระหว่าง float และ double กับตัวอย่างโค้ดในภาษาโปรแกรม C มาเริ่มกันเลย! Float vs Double … ข้อตกลงคืออะไร?
Float และ Double เป็นข้อมูลที่ใช้สำหรับการคำนวณทางคณิตศาสตร์แบบลอยตัวให้คิดเลขทศนิยมที่คุณคำนวณในคลาสคณิตศาสตร์เช่น20 123
,
16 23 , 10. 2 ฯลฯ ไม่ได้เป็นตัวเลขทั้งหมด (เช่น 2 , 5 , 15 ฯลฯ) ดังนั้นพวกเขาต้องพิจารณา เศษส่วนในไบนารี เป็นตัวเลขทศนิยมที่เป็นผลลัพธ์ (เช่น 20. 123 , 16. 23 ฯลฯ) ไม่สามารถแสดงได้อย่างง่ายดายโดยใช้รูปแบบไบนารีปกติ (เช่น i, Integer) ความแตกต่างหลักระหว่าง Float และ Double คืออดีตคือข้อมูลทศนิยมแบบเดียวกับที่มีความแม่นยำสูง (32 บิต) ในขณะที่ข้อมูลแบบลอยตัวแบบ double point (แบบ 64 บิต) คู่เรียกว่า "double" เนื่องจากเป็นเวอร์ชันที่มีความแม่นยำสูงแบบ double float ถ้าคุณกำลังคำนวณจำนวนมาก (คิดถึงจำนวนของ 0 ในจำนวน) ความไม่ถูกต้องจะเล็กกว่าใน Double และคุณจะไม่สูญเสียความแม่นยำมาก
float num1 = 1. f / 82;
float num2 = 0;
สำหรับ (int i = 0; i <738; ++ i)
num2 + = num1;
printf ("%.7g n", num2);
คู่ num3 = 1. 0/82;
คู่ NUM4 = 0;
สำหรับ (int i = 0; i <738; ++ i)
num4 + = num3;printf ("%. 15g n", num4);
getchar ();
}
พิมพ์ข้อมูลต่อไปนี้:
9. 000031
8 99999999999983
ที่นี่คุณจะเห็นได้ว่าความแตกต่างเล็กน้อยของความแม่นยำของ Float และ Double ทำให้คำตอบต่างกันทั้งหมดแม้ว่า Double จะมีความแม่นยำมากกว่า Float
() {
float num1 = sqrt (2382719676512365) 1230112312312312);
เลขคู่ NUM2 = sqrt (2382719676512365. 1230112312312312);
printf ("% f n", num1);printf ("% f n", num2);
getchar ();
}
ให้ผลลัพธ์ต่อไปนี้:
48813108 000000
48813109 678778
ที่นี่คุณจะเห็นว่าคำตอบใน Double มีความแม่นยำดีกว่า
โดยรวมแล้วจะเป็นการดีกว่าที่จะใช้ Double for floating-point arithmetic เนื่องจากฟังก์ชันทางคณิตศาสตร์หลาย ๆ แบบใน C ทำงานบนคอมพิวเตอร์แบบ Double และแบบสมัยใหม่ได้รวดเร็วและมีประสิทธิภาพมากสำหรับการคำนวณจุดลอยตัวคู่ สิ่งนี้นำไปสู่การลดความจำเป็นในการใช้ Float เว้นเสียแต่ว่าคุณต้องใช้ตัวเลขลอยตัวจำนวนมาก (คิดถึงอาร์เรย์ขนาดใหญ่ที่มีตัวเลขเป็นจำนวนหลายพัน ๆ ตัว) หรือคุณใช้งานระบบที่ไม่รองรับ double- (ARM Cortex-M2, Cortex-M4 ฯลฯ) ไม่สนับสนุน Double แต่คุณควรใช้ Float นอกจากนี้สิ่งหนึ่งที่ต้องจดจำก็คือ GPU / CPU บางตัวทำงานได้ดีขึ้น / มีประสิทธิภาพในการประมวลผลแบบลอยตัวเช่นในการคำนวณเวกเตอร์ / เมตริกซ์ดังนั้นคุณอาจต้องดูคู่มือฮาร์ดแวร์ / คู่มือฮาร์ดแวร์เพื่อตัดสินใจเลือกใช้ สำหรับเครื่องเฉพาะ
ไม่ค่อยมีเหตุผลที่จะใช้ Float แทน Double ในโค้ดที่กำหนดเป้าหมายคอมพิวเตอร์ที่ทันสมัย ความแม่นยำยิ่งขึ้นใน Double ช่วยลด แต่ไม่ได้ลดโอกาสในการปัดเศษผิดพลาดหรือความไม่แม่นยำอื่น ๆ ที่อาจทำให้เกิดปัญหาในส่วนอื่น ๆ ของโปรแกรม ฟังก์ชันทางคณิตศาสตร์หรือโอเปอเรเตอร์หลายตัวแปลงและส่งคืน Double ดังนั้นคุณจึงไม่จำเป็นต้องโยนตัวเลขกลับไปที่ Float เนื่องจากอาจสูญเสียความแม่นยำสำหรับการวิเคราะห์รายละเอียดเกี่ยวกับเลขทศนิยมแบบลอยตัวผมขอแนะนำให้คุณอ่านบทความที่น่าสนใจ (//docs. oracle. com / cd / E19957-01 / 806-3568 / ncg_goldberg. html)
สรุป
ดังนั้น … สรุป:
สถานที่ที่คุณควรใช้ Float:
หากคุณกำหนดเป้าหมายฮาร์ดแวร์ที่ความแม่นยำเพียงอย่างเดียวจะเร็วกว่าความแม่นยำสองเท่า
แอปพลิเคชันของคุณใช้การคำนวณเลขทศนิยมแบบหนัก ๆ เช่นตัวเลขนับพัน ๆ ที่มีหลายพันของ 0
คุณกำลังใช้การเพิ่มประสิทธิภาพในระดับต่ำมาก ตัวอย่างเช่นคุณกำลังใช้คำแนะนำของ CPU พิเศษ (เช่น SSE, SSE2, AVX เป็นต้น) ที่ทำงานกับหมายเลข / อาร์เรย์ / เวกเตอร์หลาย ๆ ครั้ง
ข้อสรุป