JavaRush /จาวาบล็อก /Random-TH /ภายในตัวเลขทศนิยมคืออะไร และมันทำงานอย่างไร?
Ivan
ระดับ
Харьков

ภายในตัวเลขทศนิยมคืออะไร และมันทำงานอย่างไร?

เผยแพร่ในกลุ่ม

เนื้อหา:

รูปภาพ: http://pikabu.ru/

การแนะนำ

ในช่วงวันแรก ๆ ของการเรียนรู้ Java ฉันได้พบกับ primitive ประเภทที่แปลกประหลาด เช่น ตัวเลขทศนิยม ฉันสนใจคุณสมบัติของพวกเขาทันที และยิ่งไปกว่านั้นคือวิธีที่พวกเขาเขียนด้วยรหัสไบนารี่ (ซึ่งเชื่อมโยงถึงกัน) ไม่เหมือนกับช่วงของจำนวนเต็มใดๆ แม้จะอยู่ในช่วงที่น้อยมาก (เช่น จาก 1 ถึง 2) ก็มีจำนวนอนันต์ และด้วยขนาดหน่วยความจำที่จำกัดจึงไม่สามารถแสดงชุดนี้ได้ แล้วพวกมันแสดงออกมาในรูปแบบไบนารี่ได้อย่างไร และพวกมันทำงานอย่างไร? อนิจจาคำอธิบายในวิกิและบทความที่ค่อนข้างเจ๋งเกี่ยวกับHabré ที่นี่ไม่ได้ทำให้ฉันเข้าใจได้ครบถ้วนแม้ว่าพวกเขาจะวางรากฐานก็ตาม การตระหนักรู้เกิดขึ้นหลังจากอ่านบทความวิเคราะห์ นี้ ในตอนเช้าหลังจากอ่านเท่านั้น

ทัศนศึกษาในประวัติศาสตร์

( นำมาจากบทความเรื่อง Habré นี้ ) ในยุค 60-70 เมื่อคอมพิวเตอร์มีขนาดใหญ่และโปรแกรมมีขนาดเล็ก ยังคงไม่มีมาตรฐานเดียวในการคำนวณ เช่นเดียวกับมาตรฐานในการแสดงตัวเลขทศนิยมด้วยตัวมันเอง คอมพิวเตอร์แต่ละเครื่องทำมันแตกต่างกัน และแต่ละเครื่องก็มีข้อผิดพลาดของตัวเอง แต่ในช่วงกลางทศวรรษที่ 70 Intel ตัดสินใจสร้างโปรเซสเซอร์ใหม่ที่รองรับเลขคณิต "ที่ได้รับการปรับปรุง" และในขณะเดียวกันก็สร้างมาตรฐานให้กับมัน ศาสตราจารย์ William Kahan และ John Palmer (ไม่ใช่ ไม่ใช่ผู้เขียนหนังสือเกี่ยวกับเบียร์) ถูกนำเข้ามาเพื่อพัฒนาเบียร์ชนิดนี้ มีดราม่าอยู่บ้าง แต่มีการพัฒนามาตรฐานใหม่ ปัจจุบันมาตรฐานนี้เรียกว่า IEEE754

รูปแบบตัวเลขทศนิยม

แม้แต่ในตำราเรียนของโรงเรียนทุกคนก็ต้องเผชิญกับวิธีการเขียนตัวเลขขนาดใหญ่มากหรือเล็กมากในรูปแบบ 1.2 × 10 3หรือ1.2 E3ซึ่งเท่ากับ1.2 × 1,000 = 1200 . สิ่งนี้เรียกว่าวิธีการแสดงสัญลักษณ์เอ็กซ์โปเนนเชียล ในกรณีนี้ เรากำลังจัดการกับการแสดงออกของตัวเลขโดยใช้สูตร: N=M×n pโดยที่
  • N = 1200 - หมายเลขผลลัพธ์
  • M = 1,2 - แมนทิสซา - ส่วนที่เป็นเศษส่วนโดยไม่คำนึงถึงคำสั่งของบัญชี
  • n = 10เป็นฐานของลำดับ ในกรณีนี้และเมื่อเราไม่ได้พูดถึงคอมพิวเตอร์ เลขฐานคือเลข 10
  • p = 3 - ระดับฐาน
บ่อยครั้ง ฐานของลำดับจะถือว่าเป็น10 และเขียนเฉพาะแมนทิสซาและค่าของฐานเท่านั้น โดยคั่นด้วยตัวอักษรE ในตัวอย่างของเรา ฉันให้ค่าที่เทียบเท่ากัน1.2 × 10 3และ1.2 E3 หากทุกอย่างชัดเจน และเราเสร็จสิ้นการท่องอดีตในหลักสูตรของโรงเรียนแล้ว ตอนนี้ฉันขอแนะนำให้ลืมสิ่งนี้ เพราะเมื่อสร้างจำนวนจุดลอยตัวที่เรากำลังเผชิญอยู่ กำลังสอง ไม่ใช่สิบ เช่น n = 2สูตรที่กลมกลืนกันทั้งหมด1.2E3พังและทำให้สมองฉันพังจริงๆ

ลงชื่อและปริญญา

แล้วเรามีอะไรบ้าง? เป็นผลให้เรามีเลขฐานสองซึ่งประกอบด้วยแมนทิสซา - ส่วนที่เราจะยกกำลังและยกกำลังเอง นอกจากนี้ เช่นเดียวกับทั่วไปในประเภทจำนวนเต็ม ตัวเลขทศนิยมจะมีบิตที่กำหนดเครื่องหมาย ไม่ว่าตัวเลขนั้นจะเป็นบวกหรือลบก็ตาม ตัวอย่างเช่นฉันเสนอให้พิจารณาประเภทfloatซึ่งประกอบด้วย 32 บิต ด้วยตัวเลขความแม่นยำสองเท่าdoubleตรรกะจะเหมือนกัน เพียงแต่มีจำนวนบิตเป็นสองเท่าเท่านั้น จาก 32 บิต บิตแรกที่สำคัญที่สุดจะถูกจัดสรรให้กับเครื่องหมาย ส่วน 8 บิตถัดไปจะถูกจัดสรรให้กับเลขชี้กำลัง - พลังที่เราจะยกแมนทิสซาและอีก 23 บิตที่เหลือ - ไปยังแมนทิสซา เพื่อสาธิต ลองดูตัวอย่าง: มีอะไรอยู่ในจำนวนจุดลอยตัวและทำงานอย่างไร - 1บิตแรกนั้นง่ายมาก หากค่าของบิตแรกเป็น 0ตัวเลขที่เราได้รับจะเป็นค่าบวก ถ้าบิตเป็น1ตัวเลขจะเป็นลบ บล็อกถัดไปของ 8 บิตคือบล็อกเลขชี้กำลัง และเพื่อ ให้ได้ระดับที่ต้องการ เราจำเป็นต้องลบ127 จาก ตัวเลขผลลัพธ์ ในกรณีของเรา เลขชี้กำลังแปดบิตคือ10000001 ซึ่งตรงกับหมายเลข129 . หากคุณมีคำถามเกี่ยวกับวิธีการคำนวณ รูปภาพจะแสดงคำตอบอย่างรวดเร็ว สามารถรับเวอร์ชันขยายได้ในหลักสูตรพีชคณิตแบบบูล มีอะไรอยู่ในจำนวนจุดลอยตัวและทำงานอย่างไร - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 คำนวณได้ไม่ยากว่าจำนวนสูงสุดที่เราได้จาก 8 บิตนี้คือ 11111111 2 = 255 10 (ตัวห้อย2และ10หมายถึงระบบเลขฐานสองและเลขฐานสิบ) อย่างไรก็ตาม หากเราใช้เฉพาะค่าเลขชี้กำลังบวก ( ตั้งแต่ 0 ถึง 255 ) แล้วตัวเลขที่ได้จะมีตัวเลขอยู่ข้างหน้าจุดทศนิยมหลายตัวแต่ไม่อยู่หลัง? ในการรับค่าลบของระดับ คุณต้องลบ127 จากเลขชี้กำลัง ที่ สร้างขึ้น ดังนั้นช่วงขององศาจะอยู่ระหว่าง -127 ถึง 128 . จากตัวอย่างของเรา ระดับที่ต้องการจะเป็น129-127 = 2 จำตัวเลขนี้ไว้ก่อน

แมนทิสซา

ตอนนี้เกี่ยวกับแมนทิสซา ประกอบด้วย 23 บิต แต่ที่จุดเริ่มต้นมักจะมีอีกหน่วยหนึ่งที่บอกเป็นนัยเสมอ ซึ่งบิตนั้นจะไม่ได้รับการจัดสรร สิ่งนี้ทำเพื่อเหตุผลของความได้เปรียบและเศรษฐกิจ จำนวนเดียวกันสามารถแสดงเป็นกำลังที่แตกต่างกันได้โดยการบวกเลขศูนย์ที่หน้าแมนทิสซาก่อนหรือหลังจุดทศนิยม วิธีที่ง่ายที่สุดที่จะเข้าใจสิ่งนี้คือใช้เลขชี้กำลังทศนิยม: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8เป็นต้น อย่างไรก็ตาม โดยการป้อนตัวเลขคงที่ในหัวของแมนทิสซา เราก็จะได้รับตัวเลขใหม่ทุกครั้ง ยอมรับเสียก่อนว่าก่อนที่ 23 บิตของเราจะมีอีกหนึ่งบิตด้วยหนึ่งอัน โดยปกติแล้วบิตนี้จะถูกแยกออกจากส่วนที่เหลือด้วยจุด ซึ่งไม่ได้มีความหมายอะไรเลย สะดวกกว่า 1. 1110000000000000000000000 มีอะไรอยู่ในจำนวนจุดลอยตัวและทำงานอย่างไร - 3ตอนนี้ แมนทิสซาที่ได้จะต้องยกกำลังจากซ้ายไปขวา โดยลดกำลังลงทีละขั้นในแต่ละขั้น เราเริ่มจากค่าของกำลังที่เราได้รับจากการคำนวณคือ2 (ฉันจงใจเลือกตัวอย่างง่ายๆ เพื่อไม่ให้เขียนแต่ละค่าของกำลังสองและไม่ได้คำนวณในตารางด้านบนเมื่อ บิตที่สอดคล้องกันคือศูนย์) มีอะไรอยู่ในจำนวนจุดลอยตัว และทำงานอย่างไร - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 และได้ผลลัพธ์7.5สามารถตรวจสอบความถูกต้องได้ที่ลิงค์นี้

ผลลัพธ์

จำนวนจุดลอยตัวมาตรฐานfloatประกอบด้วย 32 บิต บิตแรกคือเครื่องหมาย (+ หรือ -) บิตแปดถัดไปคือเลขชี้กำลัง ส่วน 23 ถัดไปคือแมนทิสซาตามเครื่องหมาย - หากบิต 0 เป็นจำนวนบวก ถ้าบิต 1 เป็นลบ โดยเลขชี้กำลัง - เราแปลงระดับบิตเป็นเลขทศนิยม (บิตแรกจากซ้ายคือ128บิตที่สองคือ64บิตที่สามคือ32บิตที่ สี่คือ 16 บิตที่ห้า คือ8บิตที่หกคือ4ที่ เจ็ด คือ2ที่แปดคือ1 ) ลบ127 จากตัวเลขผลลัพธ์ เราจะได้ระดับที่เราจะเริ่มต้น ตามแมนทิสซา - สำหรับ 23 บิตที่มีอยู่ข้างหน้าเราจะเพิ่มอีกบิตด้วยค่า 1 และจากนั้นเราก็เริ่มเพิ่มกำลังที่เราได้รับ โดยลดกำลังนี้ลงในแต่ละบิตที่ตามมา นั่นคือทั้งหมด เด็ก ๆ ! มีอะไรอยู่ในจำนวนจุดลอยตัวและทำงานอย่างไร - 5PS: ในการบ้าน ให้ใช้บทความนี้ แสดงความคิดเห็นในเวอร์ชันของคุณว่าทำไมข้อผิดพลาดที่แม่นยำจึงเกิดขึ้นกับการดำเนินการทางคณิตศาสตร์จำนวนมากที่มีตัวเลขทศนิยม
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION