ความแตกต่างระหว่าง Float And Double - ที่ใดที่ฉันควรใช้? ความแตกต่างระหว่าง

Anonim

(หมายเหตุ: บทความนี้ สมมติว่าผู้อ่านเข้าใจเกี่ยวกับพื้นฐานของวิทยาการคอมพิวเตอร์)

โปรแกรมเมอร์ 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 และ Double ผ่านฟังก์ชันคณิตศาสตร์ที่ให้ไว้ในภาษา C: #include

int main () {

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 เป็นต้น) ที่ทำงานกับหมายเลข / อาร์เรย์ / เวกเตอร์หลาย ๆ ครั้ง

ข้อสรุป

ในบทความนี้ผมได้เน้นความแตกต่างระหว่าง Float และ Double และควรใช้ที่ใดในสถานที่เฉพาะ น่าจะเป็นการดีกว่าที่จะใช้ Double ในหลายสถานที่โดยสุ่มสี่สุ่มห้าโดยเฉพาะอย่างยิ่งหากคุณกำหนดเป้าหมายไปยังคอมพิวเตอร์สมัยใหม่เนื่องจากโอกาสในการใช้ประสิทธิภาพต่ำเนื่องจากการใช้เลขทศนิยมแบบลอยตัวเป็นเรื่องที่ไม่น่าเป็นไปได้ หากคุณมีคำถามใด ๆ คุณสามารถสอบถามได้จากหัวข้อความคิดเห็นด้านล่างนี้!