จุดคงที่เทียบกับจำนวนจุดลอยตัว


109

ฉันไม่เข้าใจจุดคงที่และตัวเลขทศนิยมเนื่องจากอ่านคำจำกัดความเกี่ยวกับพวกเขาได้ยากใน Google แต่ไม่มีที่ฉันได้อ่านให้คำอธิบายที่เรียบง่ายเพียงพอว่าแท้จริงแล้วคืออะไร ฉันสามารถหาคำจำกัดความธรรมดาพร้อมตัวอย่างได้หรือไม่?


ฉันยังมีปัญหาในการหาคำจำกัดความที่ดี สิ่งสำคัญที่ฉันมองหาคือสิ่งที่จะช่วยให้ฉันเข้าใจผลลัพธ์เหล่านี้: 3.11 + 42.0 = 45.110001 (ไม่ใช่ 45.11), 3.12 + 42.0 = 45.119999 (ไม่ใช่ 45.12), 3.15 + 42.0 = 45.150002 (ไม่ใช่ 45.15)
Bart S.

1
ฉันคิดว่านี่เป็นการอภิปรายที่เกี่ยวข้อง (โดยเฉพาะการอธิบายกับดักที่มีตัวเลขลอยตัวและความแม่นยำที่ดีกว่าด้วยจุดคงที่และทำไมคุณไม่ต้องการที่จะมองข้ามเงินเป็นลอยstackoverflow.com/questions/6320209/…
Andrew Norman

ลิงก์สุ่มที่มีการกล่าวถึงหัวข้อ "OpenGL® ES OpenGL ES ประกอบด้วยโปรไฟล์สำหรับระบบจุดลอยตัวและจุดคงที่และข้อกำหนด EGL ™ ... "
The Red Pea

คำตอบ:


145

หมายเลขจุดคงที่มีจำนวนบิต (หรือหลัก) ที่สงวนไว้สำหรับส่วนจำนวนเต็ม (ส่วนที่อยู่ทางซ้ายของจุดทศนิยม) และจำนวนบิตเฉพาะที่สงวนไว้สำหรับส่วนเศษส่วน (ส่วนทางด้านขวาของทศนิยม จุด). ไม่ว่าจำนวนของคุณจะมีขนาดใหญ่หรือเล็ก แต่ก็จะใช้จำนวนบิตเท่ากันสำหรับแต่ละส่วน ตัวอย่างเช่นหากรูปแบบจุดคงที่ของคุณเป็นทศนิยมIIIII.FFFFFจำนวนที่มากที่สุดที่คุณสามารถแทนได้จะเป็น99999.99999และจำนวนที่ไม่ใช่ศูนย์ที่เล็กที่สุดจะเป็น00000.00001และจำนวนที่ไม่ใช่ศูนย์ที่เล็กที่สุดจะเป็นทุกบิตของรหัสที่ประมวลผลตัวเลขดังกล่าวจะต้องมีความรู้ในตัวว่าจุดทศนิยมอยู่ที่ใด

เลขทศนิยมไม่สงวนจำนวนบิตเฉพาะสำหรับส่วนจำนวนเต็มหรือส่วนเศษส่วน แต่จะสงวนจำนวนบิตไว้สำหรับจำนวน (เรียกว่าแมนทิสซาหรือนัยสำคัญ ) และบิตจำนวนหนึ่งที่จะบอกว่าตำแหน่งทศนิยมอยู่ที่ใดภายในจำนวนนั้น (เรียกว่าเลขชี้กำลัง ) ดังนั้นจำนวนจุดลอยที่เกิดขึ้น 10 หลักมี 2 ตัวเลขที่สงวนไว้สำหรับตัวแทนอาจเป็นตัวแทนของความคุ้มค่าที่ใหญ่ที่สุดของและไม่ใช่ศูนย์ค่าที่น้อยที่สุดของ9.9999999e+500.0000001e-49


8
-9.9999999e+50ดีที่คุณจะลืมไปว่าตัวเลขทศนิยมจะมีการเซ็นเกือบตลอดเวลาเพื่อให้ค่าต่ำสุดจริงๆจะเป็น
Brian Gordon

4
นอกจากนี้ยังมีการให้น้ำหนักเลขชี้กำลังเพื่อให้คุณสามารถแทนค่าที่ไม่ต่อเนื่องระหว่าง 0 ถึง 1 ได้มากกว่าที่คุณสามารถทำได้ระหว่าง 1,000,000 ถึง 1,000,001 และมีความซับซ้อนมากมายเกี่ยวกับการดำเนินการจุดลอยตัวที่เกิดขึ้นเช่นการตรวจสอบว่าคุณไม่ได้รายงาน 0 เนื่องจากความแตกต่างระหว่างตัวเลขสองตัวที่คล้ายกันมากเมื่ออคติไม่เพียงพอที่จะเพิ่มความแม่นยำ
Brian Gordon

28
@BrianGordon: ฉันไม่ลืมเครื่องหมายบิต; ฉันจงใจเพิกเฉยเพื่อให้มีคำอธิบายง่ายๆและไม่ต้องกังวลเกี่ยวกับความแตกต่างระหว่างค่าต่ำสุด / สูงสุดและน้อยที่สุด / ใหญ่ที่สุด ฉันยังจงใจทิ้งการให้น้ำหนักเลขชี้กำลัง (ซึ่งไม่มีส่วนเกี่ยวข้องกับจำนวนค่าที่ไม่ต่อเนื่องระหว่างตัวเลขสองตัวใด ๆ ), NaNs, infinities, normalizing, underflow ทีละน้อย, ศูนย์ที่ลงนามความจริงที่ว่าการลอยตัวส่วนใหญ่เป็นไบนารี (ซึ่งอนุญาตให้บิตแรก ของตั๊กแตนตำข้าวที่จะถูกทิ้งไว้) และอีกหลายแง่มุมที่ไม่จำเป็นในการแสดงแนวคิด
Gabe

2
เป็นทางลัดสำหรับจำนวนขั้นต่ำของจุดคงทำไม00000.00001? ฉันคาดหวังว่าจะได้เห็น00000.00000แทน นอกจากนี้คุณมีข้อมูลอ้างอิงที่ให้รายละเอียดเพิ่มเติมเกี่ยวกับตัวเลขจุดคงที่หรือไม่?
Nicholas Miller

4
@NickMiller: ขออภัยในความสับสน แต่ฉันกำลังพูดถึงตัวเลขที่ไม่ใช่ศูนย์ รูปแบบตัวอย่างของฉันสามารถแสดงถึง 0, 0.00001, 0.00002, ... , 99999.99998, 99999.99999
Gabe

31

ตัวเลขจุดคงที่หมายความว่ามีจำนวนหลักคงที่หลังจุดทศนิยม ตัวเลขทศนิยมอนุญาตให้มีจำนวนหลักที่แตกต่างกันหลังจากจุดทศนิยม

ตัวอย่างเช่นหากคุณมีวิธีการจัดเก็บตัวเลขที่ต้องใช้ตัวเลขสี่หลักหลังจุดทศนิยมมันจะเป็นจุดคงที่ หากไม่มีข้อ จำกัด นั้นก็คือจุดลอยตัว

บ่อยครั้งเมื่อมีการใช้จุดคงที่โปรแกรมเมอร์จะใช้จำนวนเต็มจริงๆแล้วตั้งสมมติฐานว่าตัวเลขบางตัวอยู่เกินจุดทศนิยม ตัวอย่างเช่นฉันอาจต้องการรักษาความแม่นยำสองหลักดังนั้นค่า 100 หมายถึงจริง 1.00, 101 หมายถึง 1.01, 12345 หมายถึง 123.45 เป็นต้น

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


2
การใช้จุดลอยตัวจะกลายเป็นปัญหาเมื่อคุณเริ่มทำการคำนวณกับพวกเขาเช่นถ้าคุณบวกเลขทศนิยมที่เล็กและใหญ่มากเข้าด้วยกัน ผลลัพธ์ที่สรุปจะสูญเสียความแม่นยำเนื่องจากต้องแสดงจำนวนที่มีสองขั้วและทศนิยมล่างจะถูกตัดออก (และไม่ถูกปัดเศษ)
Andrew Norman

2
นอกจากนี้การใช้ค่าเลขชี้กำลังในจุดลอยตัวอาจทำให้เกิดปัญหากับระบบคอมพิวเตอร์ที่คาดหวังตัวเลขมาตรฐาน
Andrew Norman

5

จากความเข้าใจของฉันเลขคณิตจุดคงที่ทำได้โดยใช้จำนวนเต็ม โดยที่ส่วนทศนิยมถูกเก็บไว้ในจำนวนบิตคงที่หรือจำนวนนั้นคูณด้วยจำนวนหลักของทศนิยมที่ต้องการ

ตัวอย่างเช่นหากจำนวน12.34ความต้องการที่จะเก็บไว้และเราจำเป็นต้องใช้เพียงตัวเลขสองหลักของความแม่นยำหลังจุดทศนิยมจำนวนคูณที่จะได้รับ100 1234เมื่อคำนวณเลขนี้เราจะใช้ชุดกฎนี้ การเพิ่ม5620หรือ56.20ไปยังหมายเลขนี้จะให้ผลผลิตในข้อมูลหรือ685468.54

หากเราต้องการคำนวณส่วนทศนิยมของจำนวนจุดคงที่เราใช้ตัวถูกดำเนินการโมดูโล (%)

12.34 (รหัสเทียม):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

ตัวเลขทศนิยมเป็นเรื่องราวที่แตกต่างอย่างสิ้นเชิงในการเขียนโปรแกรม มาตรฐานปัจจุบันสำหรับตัวเลขทศนิยมใช้บางอย่างเช่น 23 บิตสำหรับข้อมูลของจำนวน 8 บิตสำหรับเลขชี้กำลังและ 1 แต่สำหรับเครื่องหมาย ดูลิงค์ Wikipedia สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้


3

คำว่า 'จุดคงที่' หมายถึงลักษณะที่สอดคล้องกันซึ่งแสดงตัวเลขโดยมีจำนวนหลักคงที่หลังและบางครั้งก่อนหน้าจุดทศนิยม ด้วยการแทนค่าทศนิยมตำแหน่งของจุดทศนิยมสามารถ 'ลอย' โดยสัมพันธ์กับเลขนัยสำคัญของตัวเลขได้ ตัวอย่างเช่นการแทนค่าจุดคงที่ด้วยรูปแบบการจัดวางจุดทศนิยมที่สม่ำเสมอสามารถแทนตัวเลข 123.45, 1234.56, 12345.67 เป็นต้นในขณะที่การแทนค่าทศนิยมยังสามารถแทนค่า 1.234567, 123456.7, 0.00001234567, 1234567000000000 เป็นต้น


-6

ใช้หมายเลข 123.456789

  • เมื่อเป็นจำนวนเต็มจำนวนนี้จะเป็น 123
  • เป็นจุดคงที่ (2) ตัวเลขนี้จะเป็น 123.46 (สมมติว่าคุณปัดขึ้น)
  • ตัวเลขนี้จะเป็น 123.456789

จุดลอยตัวช่วยให้คุณแสดงตัวเลขส่วนใหญ่ได้อย่างแม่นยำ คงที่แม่นยำน้อยกว่า แต่ง่ายกว่าสำหรับคอมพิวเตอร์ ..


11
ความแม่นยำในการเขียนตัวเลขจะไม่เกี่ยวข้องกับการเขียนด้วยทศนิยมจำนวนเต็มหรือจุดคงที่ ซึ่งเกี่ยวข้องกับจำนวนเลขนัยสำคัญที่คุณมี ตัวอย่างเช่น INT_MAX เป็นตัวเลขที่สามารถแทนค่าเป็น int ได้อย่างแน่นอน แต่ไม่ใช่จำนวนทศนิยมเนื่องจากไม่มีความแม่นยำ 31 บิตที่จำเป็นในการแทนค่าทั้งหมด
Kian

1
คงที่มีความแม่นยำมากที่สุดตราบเท่าที่มีขนาดเพื่อรองรับตัวเลขที่เป็นปัญหา เมื่อคุณคำนวณด้วยตัวเลขจุดคงที่การปัดเศษจะเกิดขึ้นเมื่อการคำนวณมีส่วนที่เหลือเกินขีด จำกัด ทศนิยม ด้วยจุดลอยตัวคุณจะได้รับค่าที่ไม่ถูกต้องมากหากคุณเพิ่มจำนวนที่น้อยมากด้วยค่าที่มีขนาดใหญ่มาก เมื่อเกิดขึ้นตัวเลขจะหายไปโดยไม่ต้องปัดเศษ
Andrew Norman

สิ่งนี้ทำให้เข้าใจผิดและไม่ถูกต้อง จุดคงที่หมายถึงจำนวนหลักหลังจุดทศนิยมได้รับการแก้ไข มันไม่ได้บอกอะไรเกี่ยวกับความแม่นยำเท่าไหร่
Oscar Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.