ว่างานนี้ไม่สำคัญเลย! มันเป็นคุณสมบัติของการเป็นตัวแทนจุดลอยตัวของ IEEE ที่ int =floor = ⌊⋅⌋หากขนาดของตัวเลขที่เป็นปัญหานั้นมีขนาดเล็กพอ แต่การแสดงที่ต่างกันนั้นเป็นไปได้โดยที่ int (floor (2.3)) อาจเป็น 1
โพสต์นี้จะอธิบายว่าเพราะเหตุใดจึงใช้งานได้ในช่วงนั้น
ใน double คุณสามารถแทนจำนวนเต็ม 32 บิตได้โดยไม่มีปัญหา มีไม่สามารถจะมีปัญหาการปัดเศษใด ๆ แม่นยำยิ่งขึ้นเป็นสองเท่าสามารถเป็นตัวแทนของจำนวนเต็มทั้งหมดระหว่างและรวมถึง2 53และ-2 53 53
คำอธิบายสั้น ๆ : Double สามารถเก็บได้ถึง 53 หลักไบนารี เมื่อคุณต้องการมากกว่าหมายเลขจะถูกเติมด้วยเลขศูนย์ทางด้านขวา
ตามมาว่า 53 รายการเป็นหมายเลขที่ใหญ่ที่สุดที่สามารถจัดเก็บได้โดยไม่ต้องแพ็ดดิง โดยปกติแล้วตัวเลข (จำนวนเต็ม) ทั้งหมดที่ต้องการตัวเลขน้อยกว่าสามารถจัดเก็บได้อย่างถูกต้อง
เพิ่มหนึ่งถึง111 (ละเว้น) 111 (53 รายการ) ให้ผลตอบแทน 100 ... 000, (53 ศูนย์) อย่างที่เราทราบเราสามารถเก็บ 53 หลักซึ่งทำให้การเติมเต็มเป็นศูนย์ที่ถูกต้องที่สุด
นี่คือที่ 2 53มาจาก
รายละเอียดเพิ่มเติม:เราต้องพิจารณาว่าจุดลอยตัวของ IEEE-754 ทำงานอย่างไร
1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
จากนั้นคำนวณจำนวนดังนี้ (ยกเว้นกรณีพิเศษที่ไม่เกี่ยวข้องที่นี่):
-1 sign × 1.mantissa × 2 exponent - bias
โดยที่bias = 2 เลขชี้กำลัง - 1 - 1คือ 1023 และ 127 สำหรับความแม่นยำสองเท่า / เดี่ยว
เมื่อรู้ว่าการคูณด้วย2 Xจะเลื่อนบิตXทั้งหมดไปทางซ้ายมันเป็นเรื่องง่ายที่จะเห็นว่าจำนวนเต็มใด ๆ จะต้องมีบิตทั้งหมดในแมนทิสซาที่จบลงทางขวาของจุดทศนิยมเป็นศูนย์
จำนวนเต็มใด ๆ ยกเว้นศูนย์มีรูปแบบต่อไปนี้ในไบนารี:
1x ... xโดยที่x- e แทนบิตทางด้านขวาของ MSB (บิตที่สำคัญที่สุด)
เพราะเราได้รับการยกเว้นศูนย์จะมีเสมอจะ MSB ที่เป็นหนึ่งซึ่งเป็นเหตุผลที่มันไม่ได้เก็บไว้ ในการจัดเก็บจำนวนเต็มที่เราจะต้องนำมาไว้ในรูปแบบดังกล่าวข้างต้น: -1 ลงชื่อ × 1.mantissa × 2 ยกกำลัง - อคติ
นั่นคือการพูดเช่นเดียวกับการเลื่อนบิตไปที่จุดทศนิยมจนกว่าจะมีเพียง MSB ทางด้านซ้ายของ MSB บิตทั้งหมดที่ถูกต้องของจุดทศนิยมจะถูกเก็บไว้ในแมนทิสซา
จากนี้เราจะเห็นได้ว่าเราสามารถเก็บได้มากที่สุด 52 หลักไบนารีนอกเหนือจาก MSB
ตามด้วยจำนวนสูงสุดที่มีการจัดเก็บบิตทั้งหมดไว้อย่างชัดเจน
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
สำหรับสิ่งนี้เราต้องตั้งค่าเลขชี้กำลังเพื่อให้จุดทศนิยมเปลี่ยนตำแหน่ง 52 ตำแหน่ง ถ้าเราต้องเพิ่มเลขชี้กำลังหนึ่งเราไม่สามารถรู้หลักขวาไปทางซ้ายหลังจากจุดทศนิยม
111(omitted)111x.
ตามแบบแผนคือ 0 ตั้งค่า mantissa ทั้งหมดเป็นศูนย์เราได้รับหมายเลขต่อไปนี้:
100(omitted)00x. = 100(omitted)000.
นั่นคือ 1 ตามด้วย 53 ศูนย์, 52 ที่เก็บไว้และ 1 เพิ่มเนื่องจากเลขชี้กำลัง
มันหมายถึง2 53ซึ่งทำเครื่องหมายขอบเขต (ทั้งลบและบวก) ระหว่างที่เราสามารถเป็นตัวแทนของจำนวนเต็มทั้งหมดได้อย่างถูกต้อง หากเราต้องการเพิ่มหนึ่งถึง2 53เราจะต้องตั้งค่าศูนย์โดยนัย (แสดงโดยx
) เป็นหนึ่ง แต่นั่นเป็นไปไม่ได้
math.floor
ผลตอบแทนที่ลอยใน v2.6แต่มันกลับจำนวนเต็มใน v3 ณ จุดนี้ (เกือบหกปีหลังจาก OP) ปัญหานี้อาจปรากฏขึ้นไม่บ่อยนัก