อ่าน 13 นาที
เลขคณิตจุดคงที่
ใน ทางคอมพิวเตอร์ เลขทศนิยมคงที่ ( fixed-point) คือวิธีการแทน ค่า เศษส่วน (ที่ไม่ใช่จำนวนเต็ม) โดยการจัดเก็บค่าเศษส่วนด้วยจำนวนหลักคงที่ ตัวอย่างเช่น จำนวน เงินดอลลาร์...
เลขคณิตจุดคงที่
ในทางคอมพิวเตอร์ เลขทศนิยมคงที่ ( fixed-point)คือวิธีการแทน ค่า เศษส่วน (ที่ไม่ใช่จำนวนเต็ม) โดยการจัดเก็บค่าเศษส่วนด้วยจำนวนหลักคงที่ ตัวอย่างเช่น จำนวนเงินดอลลาร์ มักจะถูกจัดเก็บด้วยค่าเศษส่วนสองหลักพอดี ซึ่งแสดงถึง เศษสตางค์ (1/100 ของดอลลาร์) โดยทั่วไปแล้ว คำนี้อาจหมายถึงการแทนค่าเศษส่วนด้วยจำนวนเต็มทวีคูณของหน่วยย่อยคงที่ เช่น จำนวนชั่วโมงที่เป็นเศษส่วนด้วยจำนวนเต็มทวีคูณของช่วงเวลาสิบนาที การแทนค่าเศษส่วนของจำนวนทศนิยมคงที่มักถูกนำมาเปรียบเทียบกับการแทนค่าเศษส่วนแบบลอยตัว (floating-point ) ซึ่งซับซ้อนกว่าและต้องใช้การคำนวณที่ซับซ้อนกว่า
ในการแสดงค่าแบบจุดคงที่ เศษส่วนมักจะแสดงในฐานตัวเลข เดียวกัน กับส่วนที่เป็นจำนวนเต็ม แต่ใช้เลขยกกำลัง ลบ ของฐานbรูปแบบที่พบได้บ่อยที่สุดคือฐานสิบ (ฐาน 10) และฐานสอง (ฐาน 2) แบบหลังนี้มักเรียกว่าการปรับขนาดแบบฐานสองดังนั้น ถ้าเก็บค่าเศษส่วนn หลัก ค่าที่ได้จะเป็น จำนวนเต็มที่เป็นผลคูณของb − n เสมอ การแสดงค่าแบบจุดคงที่ยังสามารถใช้เพื่อละเว้นตัวเลขหลักต่ำสุดของค่าจำนวนเต็มได้ เช่น เมื่อแสดงค่าเงินดอลลาร์จำนวนมากเป็นผลคูณของ 1,000 ดอลลาร์ (1,000 ดอลลาร์)
เมื่อแสดงตัวเลขทศนิยมแบบจุดคงที่ให้มนุษย์อ่าน ตัวเลขทศนิยมมักจะถูกคั่นด้วยเครื่องหมายฐาน (โดยปกติคือ "." ในภาษาอังกฤษ แต่ "," หรือสัญลักษณ์อื่นๆ ในหลายภาษา) อย่างไรก็ตาม ภายในระบบนั้นไม่มีการแยกส่วน และความแตกต่างระหว่างตัวเลขทั้งสองกลุ่มนั้นถูกกำหนดโดยโปรแกรมที่ประมวลผลตัวเลขเหล่านั้นเท่านั้น
การแสดงผลแบบจุดคงที่ถือเป็นมาตรฐานในเครื่องคิดเลขเชิงกลเนื่องจากโปรเซสเซอร์ สมัยใหม่ส่วนใหญ่ มีหน่วยประมวลผลจุดลอยตัว (FPU) ที่รวดเร็ว การแสดงผลแบบจุดคงที่ในการใช้งานบนโปรเซสเซอร์จึงใช้เฉพาะในสถานการณ์พิเศษ เช่น ในไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์แบบฝัง ตัวราคาประหยัด ในแอปพลิเคชันที่ต้องการความเร็วสูงหรือ การใช้ พลังงาน ต่ำ หรือ พื้นที่ ชิป ขนาดเล็ก เช่น การประมวล ผลภาพวิดีโอและสัญญาณดิจิทัลหรือเมื่อการใช้งานนั้นเหมาะสมกับปัญหามากกว่า ตัวอย่างของกรณีหลัง ได้แก่การบัญชีจำนวนเงินดอลลาร์ เมื่อเศษส่วนของเซนต์ต้องปัดเศษเป็นเซนต์เต็มจำนวนตามวิธีการที่กำหนดไว้อย่างเคร่งครัด และการประเมินฟังก์ชันโดยการค้นหาในตารางหรือแอปพลิเคชันใดๆ ที่ต้องแสดงจำนวนตรรกยะโดยไม่มีข้อผิดพลาดในการปัดเศษ (ซึ่งจุดคงที่ทำได้ แต่จุดลอยตัวทำไม่ได้) การแสดงผลแบบจุดคงที่ยังคงเป็นมาตรฐานสำหรับ การใช้งาน อาร์เรย์เกตที่ตั้งโปรแกรมได้ (FPGA) เนื่องจากการสนับสนุนจุดลอยตัวใน FPGA ต้องการทรัพยากรมากกว่าการสนับสนุนจุดคงที่อย่างมาก[ 1 ]
การเป็นตัวแทน
| มูลค่าที่แสดง | การเป็นตัวแทน ภายใน |
|---|---|
| 0.00 | 0 |
| 0.5 | 50 |
| 0.99 | 99 |
| 2 | 200 |
| −14.1 | −1410 |
| 314.160 | 31416 |
การแสดงค่าเศษส่วนด้วยเลขทศนิยมคงที่นั้น โดยพื้นฐานแล้วคือจำนวนเต็มที่จะถูกคูณด้วยตัวคูณปรับขนาดคงที่โดยปริยาย ตัวอย่างเช่น ค่า 1.23 สามารถเก็บไว้ในตัวแปรเป็นค่าจำนวนเต็ม 123 โดยมีตัวคูณปรับขนาดโดยปริยายคือ 1/100 การแสดงค่าแบบนี้ช่วยให้หน่วยประมวลผลเลขคณิตและตรรกะ มาตรฐาน สามารถคำนวณ จำนวนตรรกยะ ได้
ค่าลบมักจะแสดงในรูปแบบเลขฐานสองแบบคงที่ (binary fixed-point) เป็นจำนวนเต็มที่มีเครื่องหมายใน รูป แบบสองคอมพลีเมนต์ (two's complement)โดยมีตัวคูณปรับขนาดโดยปริยายดังที่กล่าวมาข้างต้น เครื่องหมายของค่าจะถูกระบุโดยบิตที่มีนัยสำคัญที่สุด เสมอ (1 = ลบ, 0 = ไม่เป็นลบ) แม้ว่าจำนวนบิตเศษส่วนจะมากกว่าหรือเท่ากับจำนวนบิตทั้งหมดก็ตาม ตัวอย่างเช่น จำนวนเต็มฐานสองแบบมีเครื่องหมาย 8 บิต ( 1111 0101 ) 2 = −11 เมื่อนำมารวมกับบิตเศษส่วนโดยปริยาย −3, +5 และ +12 จะแสดงค่า −11/2 −3 = −88, −11/2 5 =−0.343 75และ −11/2 12 =−0.002 685 546 875ตามลำดับ
อีกทางเลือกหนึ่ง ค่าลบสามารถแทนด้วยจำนวนเต็มใน รูปแบบ เครื่องหมาย-ขนาด (sign-magnitude ) ซึ่งในกรณีนี้ เครื่องหมายจะไม่ถูกรวมอยู่ในจำนวนบิตเศษส่วนโดยนัย รูปแบบนี้มักใช้กันทั่วไปในเลขคณิตจุดคงที่แบบทศนิยม ดังนั้น จำนวนเต็มทศนิยม 5 หลักแบบมีเครื่องหมาย (−00 025 ) 10เมื่อนำมารวมกับจำนวนหลักทศนิยมโดยนัย −3, +5 และ +12 จะแสดงค่าเป็น −25/10 −3 =−25 000 , −25/10 5 =−0.000 25และ −25/10 12 =−0.000 000 000 025ตามลำดับ
โดยปกติแล้ว โปรแกรมจะถือว่าค่าทศนิยมคงที่ทั้งหมดที่จะถูกจัดเก็บลงในตัวแปรที่กำหนด หรือที่จะถูกสร้างขึ้นโดยคำสั่ง ที่กำหนด จะมีตัวคูณมาตราส่วนเดียวกัน พารามิเตอร์นี้สามารถเลือกได้โดยโปรแกรมเมอร์ ขึ้นอยู่กับความแม่นยำที่ต้องการและช่วงของค่าที่จะจัดเก็บ
ค่าตัวคูณปรับขนาดของตัวแปรหรือสูตรอาจไม่ปรากฏอย่างชัดเจนในโปรแกรม ดังนั้น หลักปฏิบัติที่ดีที่สุดในการเขียนโค้ดจึงกำหนดให้ต้องระบุไว้ในเอกสารประกอบอย่างน้อยที่สุดในรูป แบบของ ข้อความ แสดงความคิดเห็นในซอร์สโค้ด
การเลือกปัจจัยการปรับขนาด
เพื่อให้มีประสิทธิภาพมากขึ้น มักจะเลือกตัวคูณมาตราส่วนที่เป็นกำลัง (บวกหรือลบ) ของฐานbที่ใช้ในการแทนจำนวนเต็มภายใน อย่างไรก็ตาม บ่อยครั้งที่ตัวคูณมาตราส่วนที่ดีที่สุดนั้นขึ้นอยู่กับการใช้งาน ดังนั้น จึงมักใช้ตัวคูณมาตราส่วนที่เป็นกำลังของ 10 (เช่น 1/100 สำหรับค่าเงินดอลลาร์) เพื่อความสะดวกของผู้ใช้ แม้ว่าจำนวนเต็มจะถูกแทนด้วยเลขฐานสองภายในก็ตาม ตัวคูณมาตราส่วนทศนิยมยังเข้ากันได้ดีกับระบบเมตริก (SI)เนื่องจากตัวเลือกตัวคูณมาตราส่วนจุดคงที่มักเทียบเท่ากับการเลือกหน่วยวัด (เช่นเซนติเมตรหรือไมครอนเมื่อเทียบกับเมตร )
อย่างไรก็ตาม อาจมีการใช้ตัวประกอบการปรับขนาดอื่นๆ เป็นครั้งคราว เช่น อาจแสดงจำนวนชั่วโมงที่เป็นเศษส่วนเป็นจำนวนเต็มของวินาที กล่าวคือ เป็นจำนวนจุดคงที่ที่มีตัวประกอบการปรับขนาดเป็น 1/3600
แม้จะปัดเศษอย่างระมัดระวังที่สุดแล้ว ค่าทศนิยมคงที่ที่แสดงด้วยตัวคูณปรับขนาดSก็อาจยังมีข้อผิดพลาดได้ถึง ±0.5 × Sในค่าจำนวนเต็มที่จัดเก็บไว้ ดังนั้น โดยทั่วไปแล้ว ตัวคูณปรับขนาดที่เล็กกว่าจะให้ผลลัพธ์ที่แม่นยำกว่า
ในทางกลับกัน ค่าตัวคูณปรับขนาดที่เล็กลงหมายถึงช่วงของค่าที่สามารถจัดเก็บในตัวแปรโปรแกรมที่กำหนดได้จะแคบลง ค่าจุดคงที่สูงสุดที่สามารถจัดเก็บในตัวแปรได้คือค่าจำนวนเต็มที่มากที่สุดที่สามารถจัดเก็บได้ คูณด้วยค่าตัวคูณปรับขนาด และในทำนองเดียวกันสำหรับค่าต่ำสุด ตัวอย่างเช่น ตารางด้านล่างแสดงค่าตัวคูณปรับขนาดโดยนัยS ค่าต่ำสุดและสูงสุดที่สามารถแสดงได้VminและVmaxและความแม่นยำδ = S /2 ของค่าที่สามารถแสดงได้ในรูปแบบจุดคงที่ไบนารีแบบมี เครื่องหมาย 16 บิต ขึ้นอยู่กับจำนวนfของบิตเศษส่วนโดยนัย
| เอฟ | เอส | δ | วีนาที | วีแม็กซ์ |
|---|---|---|---|---|
| −3 | 1/2 −3 = 8 | 4 | −262 144 | 262 136 |
| 0 | 1/2 0 = 1 | 0.5 | −32 768 | +32 767 |
| 5 | 1/2 5 = 1/32 | < 0.016 | −1 024 .000 00 | +1 023 .968 75 |
| 14 | 1/2 14 = 1/16 384 | <0.000 031 | −2.000 000 000 000 00 | +1.999 938 964 843 75 |
| 15 | 1/2 15 = 1/32 768 | <0.000 016 | −1,000,000,000,000,000 | +0.999 969 482 421 875 |
| 16 | 1/2 16 = 1/65 536 | <0.000 008 | −0.500 000 000 000 0000 | +0.499 984 741 210 9375 |
| 20 | 1/2 20 = 1/1 048 576 | <0.000 0005 | −0.031 250 000 000 000 000 00 | +0.031 249 046 325 683 593 75 |
รูปแบบจุดคงที่ที่มีตัวคูณการปรับขนาดในรูปแบบ 2 n −1 (เช่น 1, 3, 7, 15, 31 เป็นต้น) ได้รับการกล่าวว่าเหมาะสมสำหรับการประมวลผลภาพและงานประมวลผลสัญญาณดิจิทัลอื่นๆ โดยให้การแปลงที่สอดคล้องกันมากขึ้นระหว่างค่าจุดคงที่และค่าจุดลอยตัวมากกว่าการปรับขนาด 2 n ภาษาโปรแกรม Juliaใช้ทั้งสองเวอร์ชัน[ 2 ]
ค่าที่แน่นอน
เศษส่วนไบนารีใดๆa / 2mเช่น 1/16 หรือ 17/32 สามารถแสดงได้อย่างแม่นยำในระบบเลขฐานสองคงที่ โดยใช้ตัวคูณกำลังสอง 1/ 2nโดยที่n ≥ mอย่างไรก็ตาม เศษส่วนทศนิยมส่วนใหญ่ เช่น 0.1 หรือ 0.123 เป็นเศษส่วนซ้ำ อนันต์ ในฐาน 2 ดังนั้นจึงไม่สามารถแสดงด้วยวิธีนั้นได้
ในทำนองเดียวกัน เศษส่วนทศนิยมใดๆa /10 mเช่น 1/100 หรือ 37/1000 สามารถแสดงได้อย่างแม่นยำในรูปแบบจุดคงที่ด้วยตัวคูณกำลังสิบ 1/10 nโดยที่n ≥ mรูปแบบทศนิยมนี้ยังสามารถแสดงเศษส่วนไบนารีใดๆa /2 mเช่น 1/8 (0.125) หรือ 17/32 (0.53125) ได้อีกด้วย
โดยทั่วไปแล้วจำนวนตรรกยะa / bซึ่งaและb เป็นจำนวนเฉพาะสัมพัทธ์และbเป็นจำนวนบวก จะสามารถแสดงได้อย่างแม่นยำในระบบเลขฐานสองแบบคงที่ได้ก็ต่อเมื่อbเป็นกำลังของ 2 เท่านั้น และในระบบเลขฐานสิบแบบคงที่ได้ก็ต่อเมื่อbไม่มี ตัวประกอบ เฉพาะอื่นนอกจาก 2 หรือ 5
การเปรียบเทียบกับเลขทศนิยม
การคำนวณแบบจุดคงที่อาจเร็วกว่าหรือใช้ฮาร์ดแวร์น้อยกว่าการคำนวณแบบจุดลอยตัว หากทราบช่วงของค่าที่จะแสดงล่วงหน้าและมีขอบเขตจำกัดเพียงพอ การคำนวณแบบจุดคงที่สามารถใช้บิตที่มีอยู่ได้อย่างมีประสิทธิภาพมากขึ้น ตัวอย่างเช่น หากมี 32 บิตสำหรับแสดงเลขทศนิยมระหว่าง 0 ถึง 1 การแสดงผลแบบจุดคงที่จะมีข้อผิดพลาดน้อยกว่า1.2 × 10 −10ในขณะที่ การแสดงค่าจุดลอยตัวตามมาตรฐาน IEEE 754อาจมีข้อผิดพลาดได้ถึง596 × 10 −10เนื่องจาก 9 บิตถูกจัดสรรให้กับเครื่องหมายและเลขชี้กำลังของตัวประกอบการปรับขนาดแบบไดนามิก ซึ่งไม่ได้ใช้งานในช่วงค่าที่จำกัดนี้ สำหรับการบันทึกเสียงดิจิทัลที่ต้องการน้อยกว่าด้วยค่าheadroom 40 dBระบบเลขฐาน 32 บิตแบบ fixed-point จะมีอัตราส่วนสัญญาณต่อสัญญาณรบกวน สูง กว่าระบบเลขฐาน floating-point
โดยทั่วไปแล้ว โปรแกรมที่ใช้การคำนวณแบบจุดคงที่ (fixed-point) จะพกพาได้ง่ายกว่าโปรแกรมที่ใช้การคำนวณแบบจุดลอยตัว (floating-point) เนื่องจากไม่ขึ้นอยู่กับความพร้อมใช้งานของหน่วยประมวลผลจุดลอยตัว (FPU) ข้อได้เปรียบนี้เด่นชัดเป็นพิเศษก่อนที่มาตรฐานจุดลอยตัวของ IEEEจะได้รับการยอมรับอย่างกว้างขวาง เนื่องจากในสมัยนั้น การคำนวณแบบจุดลอยตัวด้วยข้อมูลชุดเดียวกันจะให้ผลลัพธ์ที่แตกต่างกันไปขึ้นอยู่กับผู้ผลิต และบ่อยครั้งก็ขึ้นอยู่กับรุ่นของคอมพิวเตอร์ด้วย
โปรเซสเซอร์แบบฝังตัวจำนวนมากไม่มีหน่วยประมวลผลทศนิยม (FPU) เนื่องจากหน่วยคำนวณเลขจำนวนเต็มต้องการเกตตรรกะ น้อยกว่ามาก และใช้ พื้นที่ ชิป น้อย กว่า FPU มาก และการจำลอง ซอฟต์แวร์ ของเลขทศนิยมบนอุปกรณ์ความเร็วต่ำจะช้าเกินไปสำหรับแอปพลิเคชันส่วนใหญ่ ชิป CPU สำหรับคอมพิวเตอร์ส่วนบุคคลและเครื่องเล่นเกม รุ่นก่อนๆ เช่นIntel 386และ486SXก็ไม่มี FPU เช่นกัน
ความ ละเอียด สัมบูรณ์ (ความแตกต่างระหว่างค่าที่ต่อเนื่องกัน) ของรูปแบบเลขทศนิยมคงที่ใดๆ จะคงที่ตลอดช่วงทั้งหมด กล่าวคือ เท่ากับตัวประกอบการปรับขนาดSในทางตรงกันข้าม ความละเอียด สัมพัทธ์ของรูปแบบเลขทศนิยมลอยตัวจะคงที่โดยประมาณตลอดช่วงทั้งหมด โดยแปรผันภายในตัวประกอบของฐานbในขณะที่ ความละเอียด สัมบูรณ์จะแปรผันได้หลายลำดับความ magnitud เช่นเดียวกับค่าเหล่านั้นเอง
ในหลายกรณี ข้อผิดพลาด จากการปัดเศษและการตัดทอนของการคำนวณแบบจุดคงที่นั้นวิเคราะห์ได้ง่ายกว่าการคำนวณแบบจุดลอยตัวที่เทียบเท่ากัน การใช้เทคนิคการทำให้เป็นเชิงเส้นกับการตัดทอน เช่นการแจกแจง แบบกระจาย และ/หรือการปรับรูปร่างสัญญาณรบกวนนั้นทำได้ง่ายกว่าในการคำนวณแบบจุดคงที่ ในทางกลับกัน การใช้จุดคงที่นั้นต้องการความระมัดระวังจากโปรแกรมเมอร์มากขึ้น การหลีกเลี่ยงการโอเวอร์โฟลว์ต้องใช้การประมาณค่าช่วงของตัวแปรและค่ากลางทั้งหมดในการคำนวณที่แม่นยำยิ่งขึ้น และมักจะต้องมีโค้ดเพิ่มเติมเพื่อปรับปัจจัยการปรับขนาดด้วย การเขียนโปรแกรมแบบจุดคงที่โดยปกติแล้วต้องใช้ชนิดข้อมูลจำนวนเต็มที่มีความกว้างต่างกันแอปพลิเคชันแบบจุดคงที่สามารถใช้จุดลอยตัวแบบบล็อก ได้ ซึ่งเป็นสภาพแวดล้อมแบบจุดคงที่ที่มีอาร์เรย์ (บล็อก) ของข้อมูลจุดคงที่แต่ละชุดถูกปรับขนาดด้วยเลขชี้กำลังร่วมกันในคำเดียว
แอปพลิเคชัน
การใช้เลขฐานสิบคงที่โดยทั่วไปคือการจัดเก็บค่าเงิน ซึ่งกฎการปัดเศษที่ซับซ้อนของเลขฐานลอยตัวมักเป็นข้อจำกัด ตัวอย่างเช่น แอปพลิเคชันการจัดการเงินแบบโอเพนซอร์สGnuCashซึ่งเขียนด้วยภาษา C ได้เปลี่ยนจากเลขฐานลอยตัวเป็นเลขฐานสิบคงที่ในเวอร์ชัน 1.6 ด้วยเหตุผลนี้[ 3 ]
ระบบเลขฐานสองแบบคงที่ (การปรับขนาดแบบไบนารี) ถูกนำมาใช้กันอย่างแพร่หลายตั้งแต่ปลายทศวรรษ 1960 ถึงทศวรรษ 1980 สำหรับการคำนวณแบบเรียลไทม์ที่ต้องใช้คณิตศาสตร์ขั้นสูง เช่นการจำลองการบินและใน อัลกอริธึมควบคุม โรงไฟฟ้านิวเคลียร์ ปัจจุบันก็ยังคงใช้ในแอปพลิเคชัน DSPและไมโครโปรเซสเซอร์ที่สร้างขึ้นเองจำนวนมาก การคำนวณที่เกี่ยวข้องกับมุมจะใช้ การวัดเชิงมุมแบบไบนารี
ระบบเลขฐานสองแบบคงที่ (Binary fixed point) ถูกนำมาใช้ในหน่วยประมวลผลร่วมCORDICซีรี่ส์STM32G4 และในอัลกอริธึม การแปลงโคไซน์แบบไม่ต่อเนื่อง (Discrete cosine transform)ที่ใช้ในการบีบอัดภาพ JPEG
เครื่องมืออิเล็กทรอนิกส์ เช่นมิเตอร์ไฟฟ้าและนาฬิกาดิจิทัลมักใช้พหุนามเพื่อชดเชยข้อผิดพลาดที่เกิดขึ้น เช่น จากอุณหภูมิหรือแรงดันไฟฟ้าของแหล่งจ่ายไฟสัมประสิทธิ์ถูกสร้างขึ้นโดยการถดถอยพหุนามพหุนามแบบไบนารีจุดคงที่สามารถใช้บิตความแม่นยำได้มากกว่าแบบจุดลอยตัว และทำได้ในโค้ดที่รวดเร็วโดยใช้ซีพียูราคาไม่แพง ความแม่นยำ ซึ่งมีความสำคัญอย่างยิ่งสำหรับเครื่องมือ จะเทียบได้ดีกับการคำนวณแบบจุดลอยตัวที่มีบิตเทียบเท่ากัน หากพหุนามจุดคงที่ได้รับการประเมินโดยใช้วิธีของ Horner (เช่นy = (( ax + b ) x + c ) x + d ) เพื่อลดจำนวนครั้งที่เกิดการปัดเศษ และการคูณแบบจุดคงที่ใช้ตัวบวกที่ปัดเศษ
การดำเนินงาน
การบวกและการลบ
ในการบวกหรือลบค่าสองค่าที่มีตัวคูณแฝงเดียวกันนั้น เพียงแค่บวกหรือลบจำนวนเต็มที่เป็นพื้นฐานก็เพียงพอแล้ว ผลลัพธ์จะมีตัวคูณแฝงร่วมกัน และสามารถเก็บไว้ในตัวแปรโปรแกรมเดียวกันกับตัวถูกดำเนินการได้ การดำเนินการเหล่านี้จะให้ผลลัพธ์ทางคณิตศาสตร์ที่ถูกต้องแม่นยำ ตราบใดที่ไม่มีการโอเวอร์โฟลว์เกิดขึ้น นั่นคือ ตราบใดที่จำนวนเต็มที่ได้สามารถเก็บไว้ในตัวแปร โปรแกรมที่รับค่าได้ หากเกิดการโอเวอร์โฟลว์ขึ้น จะเกิดขึ้นเช่นเดียวกับจำนวนเต็มทั่วไปที่มีเครื่องหมายเดียวกัน ในกรณีที่ไม่มีเครื่องหมายและมีเครื่องหมายโดยใช้ระบบเลขฐานสองส่วนเติม เต็ม พฤติกรรมการโอเวอร์โฟลว์เป็นที่รู้จักกันดีในกลุ่มจำกัด
หากตัวถูกดำเนินการมีตัวคูณปรับขนาดที่แตกต่างกัน จะต้องแปลงตัวถูกดำเนินการเหล่านั้นให้มีตัวคูณปรับขนาดเดียวกันก่อนดำเนินการ
การคูณ
ในการคูณจำนวนจุดคงที่สองจำนวนนั้น เพียงแค่คูณจำนวนเต็มพื้นฐานทั้งสองจำนวนนั้นก็เพียงพอแล้ว และสมมติว่าตัวคูณขนาดของผลลัพธ์คือผลคูณของตัวคูณขนาดของทั้งสองจำนวนนั้น
- (p/q) * (r/s) = pr/qs
ผลลัพธ์ที่ได้จะเป็นค่าที่ถูกต้องแม่นยำ โดยไม่มีการปัดเศษ ตราบใดที่ค่าที่ได้ไม่เกินขอบเขตของตัวแปรที่รับค่า (โดยเฉพาะอย่างยิ่ง สำหรับการคูณจำนวนเต็ม ผลคูณจะมีขนาดไม่เกินสองเท่าของความกว้างของตัวประกอบทั้งสอง)
ตัวอย่างเช่น การคูณตัวเลข 123 ที่ปรับขนาดด้วย 1/1000 (0.123) และ 25 ที่ปรับขนาดด้วย 1/10 (2.5) จะได้จำนวนเต็ม 123×25 = 3075 ที่ปรับขนาดด้วย (1/1000)×(1/10) = 1/10000 นั่นคือ 3075/10000 = 0.3075 อีกตัวอย่างหนึ่ง การคูณตัวเลขแรกด้วย 155 ที่ปรับขนาดโดยปริยายด้วย 1/32 (155/32 = 4.84375) จะได้จำนวนเต็ม 123×155 = 19065 ที่ปรับขนาดโดยปริยายด้วย (1/1000)×(1/32) = 1/32000 นั่นคือ 19065/32000 = 0.59578125
ในระบบเลขฐานสอง มักใช้ตัวคูณที่เป็นกำลังของสอง หลังจากคูณแล้ว สามารถหารตัวคูณนั้นทิ้งไปได้โดยการเลื่อนบิตไปทางขวา การเลื่อนบิตนั้นง่ายและรวดเร็วในคอมพิวเตอร์ส่วนใหญ่
เมื่อใช้การเลื่อนบิตไปทางขวาหรือคำสั่งหารจำนวนเต็มทั่วไป (เช่น การหารจำนวนเต็มในภาษา C และ idiv ในภาษา x86) ผลลัพธ์จะเทียบเท่ากับการหารแบบปัดเศษลง (floor(x/y)) สามารถใช้วิธีการปัดเศษเพื่อลดข้อผิดพลาดที่เกิดขึ้นได้ มีสามรูปแบบที่เป็นไปได้โดยขึ้นอยู่กับการเลือกวิธีการแก้ปัญหาในกรณีที่ค่าเท่ากัน:
- การปัดเศษขึ้นครึ่งหนึ่งสามารถทำได้โดยการเพิ่ม 'ตัวบวกการปัดเศษ' ครึ่งหนึ่งของตัวประกอบการปรับขนาดก่อนการเลื่อน การพิสูจน์: roundup(x/y) = floor(x/y + 0.5) = floor((x + y/2)/y) ถ้า y = 2^n จะเทียบเท่ากับ (x + 2^(n−1)) >> n (โดยที่ >> แทนการเลื่อนไปทางขวา)
- การปัดเศษลงครึ่งหนึ่งนั้น เทียบได้กับการปัดเศษลงพื้น ((x - y/2)/y) หรือ (x - 2^(n-1)) >> n
- การปัดเศษครึ่งให้เป็นเลขคู่โดยพื้นฐานแล้วเกี่ยวข้องกับการตัดสินใจเพิ่มเติมเหนือการปัดเศษครึ่งขึ้น มันซับซ้อนกว่าเล็กน้อยแต่ยังคงไม่ต้องการการแยกสาขาบน CPU [ 4 ]
วิธีการปัดเศษเหล่านี้สามารถนำไปใช้ได้ในการปรับขนาดใดๆ ผ่านการหารจำนวนเต็ม ตัวอย่างเช่น วิธีการเหล่านี้ยังสามารถนำไปใช้กับการอภิปรายเกี่ยวกับการปรับขนาดได้อีกด้วย
แผนก
การหารจำนวนจุดคงที่สามารถเข้าใจได้ว่าเป็นการหารเศษส่วนสองจำนวนที่มีตัวส่วน (ตัวประกอบการปรับขนาด) ที่อาจแตกต่างกันได้ โดยที่p ⁄ qและr ⁄ s (โดยที่ p, q, rs เป็นจำนวนเต็มทั้งหมด) วิธีการแบบง่ายๆ คือการจัดเรียงเศษส่วนใหม่เพื่อสร้างตัวประกอบการปรับขนาดใหม่ (s/q):
- (p/q) / (r/s) = (p÷r) / (s÷q)
ตัวอย่างเช่น การหาร 3456 ที่ปรับขนาดด้วย 1/100 (34.56) และ 1234 ที่ปรับขนาดด้วย 1/1000 (1.234) จะได้จำนวนเต็ม 3456÷1234 = 3 (ปัดเศษ) โดยมีตัวคูณปรับขนาด (1/100)/(1/1000) = 10 หรือ 30 อีกตัวอย่างหนึ่ง การหารจำนวนแรกด้วย 155 ที่ปรับขนาดโดยปริยายด้วย 1/32 (155/32 = 4.84375) จะได้จำนวนเต็ม 3456÷155 = 22 (ปัดเศษ) โดยมีตัวคูณปรับขนาดโดยปริยาย (1/100)/(1/32) = 32/100 = 8/25 หรือ 22×32/100 = 7.04
เนื่องจากค่า s และ q ใกล้เคียงกันมาก อัลกอริทึมข้างต้นจึงส่งผลให้ได้ค่าตัวคูณปรับขนาดที่หยาบเกินไป ซึ่งสามารถปรับปรุงได้โดยการแปลงค่าตัวตั้งหารให้มีค่าตัวคูณปรับขนาดที่เล็กลงก่อน สมมติว่าเราลดค่าตัวคูณปรับขนาดลงnเท่า จากนั้นเราจะคำนวณดังนี้:
- (p/q) / (r/s) = (np/nq) / (r/s) = (np÷r) / (s÷nq)
ตัวอย่างเช่น ถ้าa = 1.23 ถูกแทนด้วย 123 โดยใช้ตัวคูณ 1/100 และb = 6.25 ถูกแทนด้วย 6250 โดยใช้ตัวคูณ 1/1000 การหารจำนวนเต็มอย่างง่ายจะได้ 123÷6250 = 0 (ปัดเศษ) โดยใช้ตัวคูณ (1/100)/(1/1000) = 10 ถ้า แปลง aเป็น 1,230,000 ก่อน โดยใช้ตัวคูณ 1/1000000 ผลลัพธ์จะเป็น 1,230,000÷6250 = 197 (ปัดเศษ) โดยใช้ตัวคูณ 1/1000 (0.197) ค่าที่แท้จริงของ 1.23/6.25 คือ 0.1968
อีกวิธีหนึ่งในการพิจารณาเรื่องการปรับขนาดคือ การพิจารณาการหาร ซึ่งเป็นการดำเนินการผกผันของการคูณ หากการคูณนำไปสู่ตัวคูณที่ละเอียดกว่า ก็เป็นเรื่องสมเหตุสมผลที่ตัวตั้งหารจะต้องมีตัวคูณที่ละเอียดกว่าเช่นกัน เพื่อให้ได้ค่าเดิมกลับคืนมา
การแปลงมาตราส่วน
ในการคำนวณแบบจุดคงที่ มักจำเป็นต้องแปลงค่าไปเป็นตัวคูณมาตราส่วนอื่น การดำเนินการนี้จำเป็นในกรณีต่างๆ เช่น:
- เพื่อจัดเก็บค่าลงในตัวแปรโปรแกรมที่มีตัวคูณปรับขนาดโดยนัยที่แตกต่างกัน
- เพื่อแปลงค่าสองค่าให้มีตัวคูณเดียวกัน เพื่อให้สามารถบวกหรือลบกันได้
- เพื่อคืนค่าตัวคูณมาตราส่วนเดิมของค่าหลังจากคูณหรือหารด้วยค่าอื่น
- เพื่อปรับปรุงความแม่นยำของผลลัพธ์การหาร;
- เพื่อให้แน่ใจว่าตัวคูณปรับขนาดของผลคูณหรือผลหารเป็นเลขยกกำลังอย่างง่าย เช่น10ⁿหรือ2ⁿ ;
- เพื่อให้มั่นใจว่าผลลัพธ์ของการดำเนินการสามารถจัดเก็บไว้ในตัวแปรของโปรแกรมได้โดยไม่เกิดการล้น
- เพื่อลดต้นทุนของฮาร์ดแวร์ที่ประมวลผลข้อมูลแบบจุดคงที่
ในการแปลงตัวเลขจากชนิดจุดคงที่ที่มีตัวคูณRไปเป็นชนิดอื่นที่มีตัวคูณSตัวเลขจำนวนเต็มต้นฉบับจะต้องถูกคูณด้วยอัตราส่วนR / Sตัวอย่างเช่น ในการแปลงค่า 1.23 = 123/100 จากตัวคูณR = 1/100 ไปเป็นค่าที่มีตัวคูณS = 1/1000 ตัวเลขจำนวนเต็ม 123 จะต้องถูกคูณด้วย (1/100)/(1/1000) = 10 ซึ่งจะได้ค่า 1230/1000
ถ้าตัวคูณปรับขนาดเป็นกำลังของฐานที่ใช้ภายในเพื่อแสดงจำนวนเต็ม การเปลี่ยนตัวคูณปรับขนาดจะทำได้โดยการตัดตัวเลขหลักต่ำของจำนวนเต็มออก หรือเพิ่มเลขศูนย์เข้าไปเท่านั้น อย่างไรก็ตาม การดำเนินการนี้ต้องรักษาสัญลักษณ์ของจำนวนนั้นไว้ ในการแสดงจำนวนแบบสองคอมพลีเมนต์ นั่นหมายถึงการขยายบิตสัญลักษณ์เช่นเดียวกับการดำเนินการ เลื่อนบิตทางคณิตศาสตร์
หากS หาร Rไม่ลงตัว(โดยเฉพาะอย่างยิ่ง หากตัวคูณใหม่S มี ค่า มากกว่าR เดิม ) จำนวนเต็มใหม่ที่ได้อาจต้องปัดเศษ
โดยเฉพาะอย่างยิ่ง ถ้าrและsเป็นตัวแปรจุดคงที่ที่มีตัวประกอบการปรับขนาดโดยปริยายRและSการดำเนินการr ← r × sจะต้องคูณจำนวนเต็มที่เกี่ยวข้องและหารผลลัพธ์ด้วยS อย่างชัดเจน ผลลัพธ์อาจต้องปัดเศษ และอาจเกิดการโอเวอร์โฟลว์ได้
ตัวอย่างเช่น ถ้าตัวคูณทั่วไปคือ 1/100 การคูณ 1.23 ด้วย 0.25 จะต้องคูณ 1.23 ด้วย 25 เพื่อให้ได้ 3075 โดยมีตัวคูณระดับกลางเป็น 1/10000 เพื่อให้กลับไปใช้ตัวคูณเดิม 1/100 จะต้องนำจำนวนเต็ม 3075 มาคูณด้วย 1/100 อีกครั้ง นั่นคือหารด้วย 100 เพื่อให้ได้ 31 (0.31) หรือ 30 (0.30) ขึ้นอยู่กับนโยบายการปัดเศษที่ใช้
ในทำนองเดียวกัน การดำเนินการr ← r / sจะต้องทำการหารจำนวนเต็มและคูณผลลัพธ์ด้วยS อย่างชัดเจน อาจเกิดการปัดเศษและ/หรือค่าเกินขีดจำกัดได้ในขั้นตอนนี้เช่นกัน
การแปลงไปมาระหว่างค่าทศนิยมและค่าทศนิยม
ในการแปลงตัวเลขจากเลขทศนิยมเป็นเลขฐานสอง เราอาจคูณตัวเลขนั้นด้วยตัวคูณSแล้วปัดเศษผลลัพธ์ให้เป็นจำนวนเต็มที่ใกล้ที่สุด ต้องระมัดระวังเพื่อให้แน่ใจว่าผลลัพธ์นั้นพอดีกับตัวแปรหรือรีจิสเตอร์ปลายทาง ทั้งนี้ขึ้นอยู่กับตัวคูณ ขนาดพื้นที่จัดเก็บ และช่วงของตัวเลขที่ป้อนเข้า การแปลงอาจไม่จำเป็นต้องปัดเศษเลยก็ได้
ในการแปลงเลขจำนวนคงที่ให้เป็นเลขจำนวนลอยตัว เราอาจแปลงจำนวนเต็มให้เป็นเลขจำนวนลอยตัวก่อน แล้วจึงหารด้วยตัวคูณSการแปลงนี้อาจต้องมีการปัดเศษ หากค่าสัมบูรณ์ของจำนวนเต็มมากกว่า 2²⁴ (สำหรับเลขจำนวนลอยตัวแบบไบนารีความแม่นยำเดี่ยว IEEE) หรือมากกว่า2⁵³ (สำหรับเลขจำนวนลอยตัวแบบความแม่นยำคู่) อาจเกิดการโอเวอร์โฟลว์หรืออันเดอร์โฟลว์ได้ หาก | S | มี ค่า มากหรือ น้อย มากตามลำดับ
การรองรับฮาร์ดแวร์
การปรับขนาดและการปรับค่าใหม่
โดยทั่วไปแล้ว โปรเซสเซอร์ไม่มีการรองรับเฉพาะสำหรับเลขคณิตแบบจุดคงที่ อย่างไรก็ตาม คอมพิวเตอร์ส่วนใหญ่ที่มีเลขคณิตแบบไบนารีจะมี คำสั่ง เลื่อนบิต ที่รวดเร็ว ซึ่งสามารถคูณหรือหารจำนวนเต็มด้วยกำลังของ 2 ใดๆ ก็ได้ โดยเฉพาะอย่างยิ่ง คำสั่ง เลื่อนเลขคณิตคำสั่งเหล่านี้สามารถใช้เพื่อเปลี่ยนตัวคูณที่เป็นกำลังของ 2 ได้อย่างรวดเร็ว ในขณะที่ยังคงรักษาเครื่องหมายของตัวเลขไว้
คอมพิวเตอร์รุ่นแรกๆ เช่นIBM 1620และBurroughs B3500ใช้ การแสดงจำนวนเต็ม แบบเลขฐานสองเข้ารหัสทศนิยม (BCD) ซึ่งก็คือฐาน 10 โดยที่แต่ละหลักทศนิยมจะถูกเข้ารหัสอย่างอิสระด้วย 4 บิต โปรเซสเซอร์บางตัว เช่น ไมโครคอนโทรลเลอร์ อาจยังคงใช้ระบบนี้อยู่ ในเครื่องเหล่านี้ การแปลงค่าตัวคูณมาตราส่วนทศนิยมสามารถทำได้โดยการเลื่อนบิตและ/หรือโดยการจัดการที่อยู่หน่วยความจำ
สถาปัตยกรรม DSP บางแบบรองรับรูปแบบจุดคงที่เฉพาะบางรูปแบบโดยตรง เช่น ตัวเลข nบิตแบบมีเครื่องหมายที่มีบิต ทศนิยม n −1 บิต (ซึ่งค่าอาจอยู่ในช่วงระหว่าง −1 ถึงเกือบ +1) การรองรับนี้อาจรวมถึงคำสั่งการคูณที่รวมการปรับค่าใหม่ (renormalization) ซึ่งเป็นการแปลงขนาดของผลคูณจาก 2 n −2 เป็น บิตทศนิยม n −1 บิต หาก CPU ไม่มีคุณสมบัตินี้ โปรแกรมเมอร์จะต้องบันทึกผลคูณไว้ในรีจิสเตอร์หรือตัวแปรชั่วคราวที่มีขนาดใหญ่พอ และเขียนโค้ดการปรับค่าใหม่โดยชัดเจน
ล้น
ภาวะโอเวอร์โฟลว์เกิดขึ้นเมื่อผลลัพธ์ของการดำเนินการทางคณิตศาสตร์มีขนาดใหญ่เกินกว่าจะจัดเก็บในพื้นที่ปลายทางที่กำหนดไว้ ในการบวกและการลบ ผลลัพธ์อาจต้องการบิตมากกว่าตัวถูกดำเนินการหนึ่งบิต ในการคูณจำนวนเต็มที่ไม่ติดลบสองจำนวนที่มีmและnบิต ผลลัพธ์อาจมีm + nบิต
ในกรณีที่เกิดการล้น (overflow) บิตลำดับสูงมักจะสูญหายไป เนื่องจากจำนวนเต็มที่ยังไม่ได้ปรับขนาดจะถูกลดทอนลงตามโมดูลัส 2<sup> n</sup>โดยที่nคือขนาดของพื้นที่จัดเก็บข้อมูล โดยเฉพาะอย่างยิ่ง บิตเครื่องหมายจะสูญหายไป ซึ่งอาจทำให้เครื่องหมายและขนาดของค่าเปลี่ยนแปลงไปอย่างมาก
โปรเซสเซอร์บางตัวสามารถตั้งค่าแฟล็กการโอเวอร์โฟลว์ ของฮาร์ดแวร์ และ/หรือสร้างข้อยกเว้นเมื่อเกิดการโอเวอร์โฟลว์ได้ โปรเซสเซอร์บางตัวอาจใช้วิธีการคำนวณแบบอิ่มตัวแทนกล่าวคือ หากผลลัพธ์ของการบวกหรือการลบเกิดการโอเวอร์โฟลว์ โปรเซสเซอร์จะเก็บค่าที่มีขนาดใหญ่ที่สุดที่สามารถพอดีกับพื้นที่รับค่าและมีเครื่องหมายที่ถูกต้องแทน
อย่างไรก็ตาม คุณสมบัติเหล่านี้ไม่ค่อยมีประโยชน์ในทางปฏิบัติ โดยทั่วไปแล้ว การเลือกตัวคูณมาตราส่วนและขนาดคำเพื่อป้องกันความเป็นไปได้ที่จะเกิดการล้น หรือการตรวจสอบค่าของตัวถูกดำเนินการว่ามีค่ามากเกินไปหรือไม่ก่อนที่จะดำเนินการนั้น ง่ายและปลอดภัยกว่า
การสนับสนุนภาษาคอมพิวเตอร์
ภาษาโปรแกรมบางภาษารองรับตัวเลขจุดคงที่อย่างชัดเจน โดยเฉพาะPL/I , COBOL , Ada , JOVIALและCoral 66 ภาษาเหล่านี้มี ชนิดข้อมูลจุดคงที่ พร้อม ด้วยตัวคูณมาตราส่วนแบบไบนารีหรือทศนิยม คอมไพเลอร์จะสร้างโค้ดโดยอัตโนมัติเพื่อทำการแปลงมาตราส่วนที่เหมาะสมเมื่อดำเนินการกับชนิดข้อมูลเหล่านี้ เมื่ออ่านหรือเขียนตัวแปร หรือเมื่อแปลงค่าเป็นชนิดข้อมูลอื่น เช่น ตัวเลขจุดลอยตัว
ภาษาโปรแกรมส่วนใหญ่ถูกออกแบบระหว่างปี 1955 ถึง 1990 ภาษาโปรแกรมที่ทันสมัยกว่ามักไม่มีชนิดข้อมูลแบบจุดคงที่ (fixed-point) หรือการสนับสนุนการแปลงค่าตัวคูณ (scaling factor conversion) เช่นเดียวกับภาษาโปรแกรมเก่าๆ หลายภาษาที่ยังคงได้รับความนิยมอย่างมาก เช่น FORTRAN , CและC++การมีโปรเซสเซอร์จุดลอยตัวความเร็วสูงที่มีพฤติกรรมเป็นมาตรฐานอย่างเคร่งครัด ทำให้ความต้องการการสนับสนุนจุดคงที่แบบไบนารีลดลงอย่างมาก ในทำนองเดียวกัน การสนับสนุนจุดลอยตัวแบบทศนิยมในบางภาษาโปรแกรม เช่นC#และPythonได้ลดความจำเป็นในการสนับสนุนจุดคงที่แบบทศนิยมลงไปมาก ในสถานการณ์ไม่กี่สถานการณ์ที่จำเป็นต้องใช้การคำนวณแบบจุดคงที่ โปรแกรมเมอร์สามารถเขียนโปรแกรมเองได้โดยใช้การแปลงค่าตัวคูณอย่างชัดเจนในภาษาโปรแกรมใดๆ ที่รองรับชนิดข้อมูลจำนวนเต็มอย่างชัดเจน
ในทางกลับกันฐานข้อมูล เชิงสัมพันธ์ทั้งหมด และ สัญกรณ์ SQLรองรับการคำนวณเลขฐานสิบแบบคงที่และการจัดเก็บตัวเลขPostgreSQLมีคุณสมบัติพิเศษเฉพาะตัวตัวเลขประเภทสำหรับการจัดเก็บตัวเลขที่แม่นยำได้ถึง 1,000 หลัก[ 5 ]
นอกจากนี้ ในปี 2551 องค์การมาตรฐานสากล (ISO) ได้เผยแพร่รายงานทางเทคนิคฉบับร่างเพื่อขยายภาษาการเขียนโปรแกรม C ด้วยชนิดข้อมูลจุดคงที่ เพื่อประโยชน์ของโปรแกรมที่ทำงานบนโปรเซสเซอร์ DSP แบบฝังตัว มีการเสนอชนิดข้อมูลหลักสองประเภท ได้แก่ _Fract (ส่วนเศษส่วนที่มีความแม่นยำอย่างน้อย 7 บิต) และ _Accum (_Fract ที่มีส่วนจำนวนเต็มอย่างน้อย 4 บิต) [ 6 ] GNU Compiler Collection (GCC) รองรับรายงานฉบับร่างนี้[ 7 ] [ 8 ]
ตัวอย่างโดยละเอียด
การคูณเลขทศนิยมแบบจุดคงที่
สมมติว่ามีการคูณต่อไปนี้ระหว่างจำนวนคงที่สองจำนวนที่มีทศนิยม 3 ตำแหน่ง
โปรดสังเกตว่า เนื่องจากมีทศนิยม 3 ตำแหน่ง เราจึงแสดงเลขศูนย์ต่อท้าย ในการแปลงสมการนี้ให้เป็นการคูณจำนวนเต็ม เราต้องคูณด้วย ก่อน เพื่อย้ายตำแหน่งทศนิยมทั้งหมดไปยังตำแหน่งจำนวนเต็ม จากนั้นเราจะคูณด้วยเพื่อย้ายตำแหน่งทศนิยมกลับไปยังตำแหน่งเดิม สมการจึงมีลักษณะดังนี้
วิธีนี้ใช้ได้ผลเช่นเดียวกันหากเราเลือกฐานอื่น โดยเฉพาะฐาน 2 สำหรับการคำนวณ เนื่องจาก1การเลื่อนบิตนั้นเหมือนกับการคูณหรือหารด้วยลำดับ 2 ตัวเลขทศนิยม 3 หลักเทียบเท่ากับตัวเลขไบนารีประมาณ 10 หลัก ดังนั้นเราควรปัดเศษ 0.05 ให้เป็น 10 บิตหลังจุดทศนิยมไบนารี ค่าประมาณที่ใกล้เคียงที่สุดคือ 0.0000110011
ดังนั้นการคูณของเราจึงกลายเป็น
เมื่อปัดเศษแล้วจะได้ 11.023 โดยมีทศนิยมสามตำแหน่ง
การคูณเลขฐานสองแบบคงที่
ลองพิจารณาการคำนวณผลคูณของ 1.2 และ 5.6 ด้วยเลขฐานสองแบบคงที่โดยใช้บิตเศษส่วน 16 บิต ในการแสดงตัวเลขทั้งสอง เราจะคูณด้วย 2¹⁶ ซึ่งจะได้78,643.2และ367,001.6จากนั้นปัดเศษค่าเหล่านี้ให้เป็นจำนวนเต็มที่ใกล้ที่สุด ซึ่งจะได้78,643และ367,002ตัวเลขเหล่านี้จะพอดีกับคำ 32 บิตในรูปแบบสองคอมพลีเมนต์แบบมีเครื่องหมาย
การคูณจำนวนเต็มเหล่านี้เข้าด้วยกันจะได้จำนวนเต็ม 35 บิต28 862 138 286โดยมีบิตทศนิยม 32 บิต โดยไม่มีการปัดเศษ โปรดทราบว่าการเก็บค่านี้ลงในตัวแปรจำนวนเต็ม 32 บิตโดยตรงจะทำให้เกิดการโอเวอร์โฟลว์และสูญเสียบิตที่มีนัยสำคัญที่สุด ในทางปฏิบัติแล้ว อาจจะเก็บค่านี้ไว้ในตัวแปรหรือรีจิสเตอร์จำนวนเต็ม 64 บิตแบบมีเครื่องหมายแทน
ถ้าผลลัพธ์จะถูกจัดเก็บในรูปแบบเดียวกับข้อมูล โดยใช้บิตทศนิยม 16 บิต จำนวนเต็มนั้นควรถูกหารด้วย 2¹⁶ ซึ่งจะได้ค่าประมาณ440,401.28แล้วจึงปัดเศษให้เป็นจำนวนเต็มที่ใกล้ที่สุด สามารถทำได้โดยการบวก 2¹⁵ แล้วเลื่อนผลลัพธ์ไป 16 บิต ผลลัพธ์ที่ได้คือ440,401ซึ่งแสดงค่า 6.719,985,961,914,062.5 เมื่อพิจารณาความแม่นยำของรูปแบบแล้ว ค่านี้ควรแสดงเป็น 6.719,986 ± 0.000,008 (โดยไม่นับข้อผิดพลาดที่เกิดจากการประมาณค่าตัวดำเนินการ) ผลลัพธ์ที่ถูกต้องคือ 1.2 × 5.6 = 6.72
สำหรับตัวอย่างที่ซับซ้อนขึ้น สมมติว่าตัวเลขสองตัวคือ 1.2 และ 5.6 ถูกแสดงในรูปแบบจุดคงที่ 32 บิต โดยมีบิตเศษส่วน 30 และ 20 บิต ตามลำดับ การปรับขนาดด้วย 2³⁰ และ 2²⁰ จะได้1 288 490 188.8 และ5 872 025.6ซึ่งปัดเศษเป็น1 288 490 189และ5 872 026ตามลำดับ ตัวเลขทั้งสองยังคงพอดีกับตัวแปรจำนวนเต็มแบบมีเครื่องหมาย 32 บิต และแสดงถึงเศษส่วน
- 1. 200 000 000 186 264 514 923 095 703 125และ
- 5. 600 000 381 469 726 562 50
ผลคูณของพวกมันคือจำนวนเต็ม 53 บิต7 566 047 890 552 914ซึ่งมีบิตเศษส่วนโดยนัย 30+20 = 50 บิต และดังนั้นจึงแสดงถึงเศษส่วน
- 6. 720 000 458 806 753 229 623 609 513 510
หากเราเลือกที่จะแสดงค่านี้ในรูปแบบคงที่ 16 บิตแบบมีเครื่องหมาย โดยมีบิตทศนิยม 8 บิต เราต้องหารผลคูณจำนวนเต็มด้วย2⁵⁰− 8 = 2⁴²แล้วปัดเศษผลลัพธ์ ซึ่งสามารถทำได้โดยการบวก 2⁴¹ แล้วเลื่อนไป 42 บิต ผลลัพธ์คือ 1720 ซึ่งแสดงค่า 1720/ 2⁸ = 6.718⁷⁵หรือช่วงระหว่าง 3439/ 2⁹และ 3441/ 2⁹ (ประมาณ 6.719 ± 0.002)
สัญลักษณ์
มีการใช้สัญลักษณ์ต่างๆ เพื่อระบุพารามิเตอร์ของรูปแบบจุดคงที่อย่างกระชับ ในรายการต่อไปนี้fแทนจำนวนบิตทศนิยมmแทนจำนวนบิตขนาดหรือจำนวนเต็มsแทนจำนวนบิตเครื่องหมาย (0/1 หรือการแสดงค่าอื่น) และbแทนจำนวนบิตทั้งหมด
- สัญกรณ์ Qได้รับการกำหนดโดยTexas Instruments [ 9 ] การเขียนเพื่อระบุค่าไบนารีแบบคงที่ที่มีเครื่องหมายพร้อม บิตเศษส่วน fบิต ตัวอย่างเช่นระบุจำนวนเต็มที่มีเครื่องหมายในรูปแบบสองส่วนเติมเต็มด้วยตัวประกอบการปรับขนาด 1/2 15รหัสระบุเพิ่มเติมว่าตัวเลขมีmบิตในส่วนจำนวนเต็มของค่า ไม่นับบิตเครื่องหมาย ดังนั้นจะอธิบายรูปแบบไบนารีแบบคงที่ที่มี 1 บิตจำนวนเต็มและ 30 บิตเศษส่วน ซึ่งสามารถจัดเก็บเป็นจำนวนเต็ม 32 บิตสองส่วนเติมเต็มที่มีตัวประกอบการปรับขนาด1/2 30 [ 9 ] [ 10 ]
QfQ15Qm.fQ1.30- ARMใช้สัญลักษณ์ที่คล้ายกันยกเว้นว่าพวกเขาจะนับบิตเครื่องหมายในค่าของmดังนั้นรูปแบบเดียวกันข้างต้นจะถูกระบุ
Q2.30เป็น[ 11 ] [ 12 ] - ข้อเสนอ Embedded C ใช้.fสำหรับเศษส่วนไม่มีเครื่องหมาย s .fสำหรับเศษส่วนมีเครื่องหมายmfสำหรับตัวสะสมไม่มีเครื่องหมาย และ s m.fสำหรับตัวสะสมมีเครื่องหมาย ซึ่งจะแปลงข้างต้นเป็น
s1.30แม้ว่านี่จะไม่ใช่ประเภทที่ถูกต้องสำหรับทั้งเศษส่วนหรือตัวสะสมก็ตาม ในเวอร์ชันที่ถูกต้องmต้องมีค่าอย่างน้อย 4 และขึ้นอยู่กับประเภทพื้นฐานfต้องมีค่าอย่างน้อย 7, 15 หรือ 23 โปรดสังเกตตัว s ที่ไม่ได้เป็นตัวเอียง: มันถูกเพิ่มไว้ข้างหน้าเหมือนตัวอักษรทั่วไป
- ARMใช้สัญลักษณ์ที่คล้ายกันยกเว้นว่าพวกเขาจะนับบิตเครื่องหมายในค่าของmดังนั้นรูปแบบเดียวกันข้างต้นจะถูกระบุ
- ภาษา การเขียนโปรแกรม COBOLเดิมทีรองรับเลขฐานสิบความแม่นยำคงที่ที่มีขนาดตามอำเภอใจและการปรับขนาดเลขฐานสิบ ซึ่งรูปแบบจะถูกระบุ "แบบกราฟิก" ด้วย คำสั่ง PICตัวอย่างเช่น
PIC S9999V99ระบุจำนวนเต็มเลขฐานสิบ 6 หลักแบบ sign-magnitude ที่มีเลขทศนิยมสองหลัก[ 13 ] - โครงสร้างนี้ใช้ใน ภาษาโปรแกรม PL/Iเพื่อระบุชนิดข้อมูลไบนารีแบบมีเครื่องหมายจุดคงที่ที่มีจำนวนบิตทั้งหมดp บิต (ไม่รวมเครื่องหมาย) โดยมี fบิตในส่วนทศนิยม กล่าวคือ จำนวนเต็มแบบมีเครื่องหมาย p + 1 บิตที่มีตัวคูณมาตราส่วน 1/ 2f ซึ่งตัวคูณ มาตราส่วนนี้อาจเป็นค่าบวกหรือลบก็ได้ เราสามารถระบุCOMPLEXแทนREALและDECIMALแทนBINARYสำหรับฐาน 10 ได้
REAL FIXED BINARY (p,f) - ในภาษาการเขียนโปรแกรม Adaชนิดข้อมูลตัวเลขสามารถระบุได้โดยใช้ตัวอย่างเช่นขอบเขตทศนิยมจะถูกแปลงเป็นกำลังสองถัดไป ดังนั้นจึงหมายถึงการแสดงจุดคงที่ซึ่งประกอบด้วยจำนวนเต็มไบนารีที่มีเครื่องหมายในรูปแบบส่วนเติมเต็มสองที่มีบิตเศษส่วนอย่างน้อย 8 บิต (ให้ตัวประกอบการปรับขนาด 1/256) และบิตเครื่องหมายและขนาด 7 บิต (รับประกันช่วงจริงตั้งแต่ −64.00 ถึงเกือบ +64.00): รวมอย่างน้อย 15 บิต บนคอมพิวเตอร์ 16 บิต บิตที่เหลือจะถูกกำหนดให้กับส่วนเศษส่วน ข้อจำกัดช่วงที่ไม่สมมาตรก็ได้รับอนุญาตเช่นกัน[ 14 ] แม้ว่าการใช้งานพื้นฐานจะยังคงสมมาตรเกี่ยวกับ 0 ก็ตาม[ 15 ] Ada เวอร์ชันใหม่กว่าอนุญาตให้ระบุตัวประกอบการปรับขนาดที่แน่นอน (รวมถึงที่ไม่ใช่กำลังสอง) โดยใช้(การระบุลักษณะ) หรือหากตัวประกอบเป็นกำลังของ 10 ผ่านจุดคงที่ทศนิยม
typeFisdelta0.005range-50.0..50.0'Small => 0.005 - สัญลักษณ์นี้ใช้เพื่อหมายถึงรูปแบบไบนารีคงที่ที่มีmบิตในส่วนจำนวนเต็ม ส่วนที่เหลือของคำ (โดยทั่วไป 32 บิต) เป็นบิตเศษส่วน ตัวอย่างเช่น ค่าสูงสุดและต่ำสุดที่สามารถจัดเก็บในจำนวนที่มีเครื่องหมายได้คือ ≈32767.9999847 และ −32768.0 ตามลำดับ
BmB16 - บริษัทVisSimเคยใช้สัญลักษณ์แทนค่าจุดคงที่ไบนารีด้วย จำนวนบิตทั้งหมด bบิตและmบิตในส่วนจำนวนเต็ม นั่นคือ จำนวนเต็ม bบิตที่มีตัวคูณ 1/2 b − mดังนั้นจึงหมายถึงจำนวน 16 บิตที่มี 1 บิตในส่วนจำนวนเต็มและ 15 บิตในส่วนเศษส่วน[ 16 ]
fxm.bfx1.16 - คู่มือ ผู้ใช้ PS2 GS ( “Graphics Synthesizer” ) ใช้สัญลักษณ์โดยที่sระบุการมีอยู่ (0 หรือ 1) ของบิตเครื่องหมาย[ 17 ]ตัวอย่างเช่น0:5:3แทนจำนวนเต็ม 8 บิตที่ไม่มีเครื่องหมายพร้อมตัวคูณมาตราส่วน1/2 3
s:m:f - ภาษา โปรแกรม LabVIEWใช้สัญลักษณ์ `s` เพื่อระบุพารามิเตอร์ของตัวเลขจุดคงที่ 'FXP' ส่วนประกอบ `s`สามารถเป็น '+' หรือ '±' ซึ่งหมายถึงตัวเลขที่ไม่มีเครื่องหมายหรือตัวเลขที่มีเครื่องหมายแบบ 2's complement ตามลำดับ ส่วนประกอบ `b`คือจำนวนบิตทั้งหมด และ`m`คือจำนวนบิตในส่วนจำนวนเต็ม
<s,b,m>
ตัวอย่างแอปพลิเคชันซอฟต์แวร์
- รูปแบบฟอนต์ TrueTypeที่ได้รับความนิยมใช้เลขฐานสองแบบคงที่ 32 บิตที่มีเครื่องหมาย โดยมี 26 บิตอยู่ทางซ้ายของจุดทศนิยมสำหรับค่าตัวเลขบางค่าในคำสั่ง[ 18 ]รูปแบบนี้ถูกเลือกเพื่อให้มีความแม่นยำขั้นต่ำที่จำเป็นสำหรับการปรับแต่งและเพื่อเหตุผลด้านประสิทธิภาพ[ 19 ]
- ยกเว้นNintendo 64เกม 3 มิติทั้งหมดสำหรับเครื่องเล่นเกมคอนโซลยุคที่ห้ารวมถึง3DO , PlayStation , Sega SaturnและAtari Jaguar [ 20 ]ใช้เลขคณิตจุดคงที่ เนื่องจากระบบเหล่านี้ไม่มีหน่วยประมวลผลจุดลอยตัวแบบฮาร์ดแวร์ ตัวประมวลผลร่วมการแปลงของ PlayStation รองรับจุดคงที่ 16 บิตพร้อมบิตเศษส่วน 12 บิต ในขณะที่ตัวประมวลผลร่วม VDP ของ Sega Saturn ใช้รูปแบบจุดคงที่ 32 บิต โดยสงวน 16 บิตล่างไว้สำหรับส่วนที่เป็นเศษส่วน
- โปรแกรม จัดเรียงตัวอักษร TeXซึ่งนักวิทยาศาสตร์และนักคณิตศาสตร์นิยมใช้กันอย่างแพร่หลาย ใช้เลขฐานสองแบบคงที่ 32 บิตที่มีเครื่องหมายและบิตเศษส่วน 16 บิตสำหรับการคำนวณตำแหน่งทั้งหมด ค่าเหล่านี้จะถูกตีความว่าเป็นเศษส่วนของ หน่วยวัดตัวอักษร (point ) ของนักจัดเรียงตัวอักษร ไฟล์เมตริกของฟอนต์ TeXใช้เลขฐานสองแบบคงที่ 32 บิตที่มีเครื่องหมายและบิตเศษส่วน 12 บิต
- Tremor , ToastและMADเป็นไลบรารีซอฟต์แวร์ที่ใช้ถอดรหัส ไฟล์เสียง Ogg Vorbis , GSM Full RateและMP3ตามลำดับ ตัวแปลงสัญญาณเหล่านี้ใช้การคำนวณเลขทศนิยมคงที่ เนื่องจากอุปกรณ์ฮาร์ดแวร์ถอดรหัสเสียงจำนวนมากไม่มีหน่วยประมวลผลทศนิยมคงที่ (FPU)
- ตัวบีบอัดเสียงแบบไม่สูญเสีย ข้อมูล WavPackใช้เลขคณิตจุดคงที่ การเลือกนี้มีเหตุผลมาจากความกังวลว่ากฎการปัดเศษจุดลอยตัวที่แตกต่างกันในฮาร์ดแวร์ต่างๆ อาจทำให้ลักษณะการบีบอัดแบบไม่สูญเสียข้อมูลเสียหายได้[ 21 ]
- ไลบรารี Nest Labs Utilities [ 22 ]มีชุดมาโครและฟังก์ชันที่จำกัดสำหรับตัวเลขจุดคงที่ โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับตัวเลขเหล่านั้นในบริบทของการสุ่มตัวอย่างเซ็นเซอร์และเอาต์พุตเซ็นเซอร์
- ข้อกำหนด OpenGL ES 1.x ประกอบด้วยโปรไฟล์จุดคงที่ เนื่องจากเป็น API ที่มุ่งเป้าไปที่ระบบฝังตัว ซึ่งไม่ได้มีหน่วยประมวลผลทศนิยม (FPU) เสมอไป
- โปรแกรม dc และbcเป็น เครื่องคิดเลข ความแม่นยำสูง แต่จะเก็บค่าทศนิยม ได้เพียงจำนวนคงที่ (ที่ผู้ใช้กำหนด) เท่านั้น
- Fractintแสดงตัวเลขเป็นตัวเลขจุดคงที่Q2.29 [ 23 ]เพื่อเร่งความเร็วในการวาดภาพบนพีซีรุ่นเก่าที่มี โปรเซสเซอร์ 386หรือ486SXซึ่งไม่มี FPU
- Doomเป็น เกม ยิงมุมมองบุคคลที่หนึ่ง เกมสุดท้าย ของ id Softwareที่ใช้การแสดงผลแบบจุดคงที่ 16.16 สำหรับการคำนวณที่ไม่ใช่จำนวนเต็มทั้งหมด รวมถึงระบบแผนที่ รูปทรงเรขาคณิต การเรนเดอร์ และการเคลื่อนไหวของผู้เล่น การแสดงผลแบบนี้ยังคงถูกใช้ในซอร์สโค้ดของDoom เวอร์ชันใหม่ๆ อยู่
- ภาษาการเขียนโปรแกรม Q #สำหรับคอมพิวเตอร์ควอนตัม Azureซึ่งใช้เกตตรรกะควอนตัมมีไลบรารีตัวเลขมาตรฐานสำหรับดำเนินการเลขคณิตจุดคงที่บนรีจิสเตอร์ของคิวบิต[ 24 ]
ดูเพิ่มเติม
- อัลกอริทึม A-law
- การปรับขนาดจุดลอยตัวแบบบล็อก
- Libfixmath - ไลบรารีที่เขียนด้วยภาษาซีสำหรับคณิตศาสตร์จุดคงที่
- ระบบจำนวนลอการิทึม
- มินิโฟลต
- การดำเนินการโมดูลัส
- คิว (รูปแบบตัวเลข)
- ประเภทข้อมูลเชิงตรรกะ
- อัลกอริทึมกฎ μ
อ่านเพิ่มเติม
- วอร์เรน จูเนียร์, เฮนรี เอส. (2013). Hacker's Delight (ฉบับที่ 2). Addison Wesley / Pearson Education, Inc. ISBN 978-0-321-84268-8.
ลิงก์ภายนอก
- คณิตศาสตร์จุดตรึงแบบง่าย
- เลขคณิตจุดคงที่ - บทนำ
- การแสดงผลแบบจุดคงที่และคณิตศาสตร์เศษส่วน เก็บถาวรเมื่อ 2017-11-04 ที่Wayback Machine
- การวิเคราะห์เชิงคำนวณเกี่ยวกับเลขคณิตจุดคงที่ ( PDF)
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ เลขคณิตจุดคงที่
ใน ทางคอมพิวเตอร์ เลขทศนิยมคงที่ ( fixed-point) คือวิธีการแทน ค่า เศษส่วน (ที่ไม่ใช่จำนวนเต็ม) โดยการจัดเก็บค่าเศษส่วนด้วยจำนวนหลักคงที่ ตัวอย่างเช่น จำนวน เงินดอลลาร์...
การเป็นตัวแทน
การแสดงค่าเศษส่วนด้วยเลขทศนิยมคงที่นั้น โดยพื้นฐานแล้วคือ จำนวนเต็มที่ จะถูกคูณด้วยตัวคูณปรับขนาดคงที่โดยปริยาย ตัวอย่างเช่น ค่า 1.
การเลือกปัจจัยการปรับขนาด
เพื่อให้มีประสิทธิภาพมากขึ้น มักจะเลือกตัวคูณมาตราส่วนที่เป็น กำลัง (บวกหรือลบ) ของฐาน b ที่ใช้ในการแทนจำนวนเต็มภายใน อย่างไรก็ตาม บ่อยครั้งที่ตัวคูณมาตราส่วนที่ดีที่สุดนั้นขึ้นอยู่กับการใช้งาน ดังนั้น จึงมักใช้ตัวคูณมาตราส่วนที่เป็นกำลังของ 10 (เช่น 1/100...
ค่าที่แน่นอน
เศษส่วนไบนารีใดๆ a / 2m เช่น 1/16 หรือ 17/32 สามารถแสดงได้อย่างแม่นยำในระบบเลขฐานสองคงที่ โดยใช้ตัวคูณกำลังสอง 1/ 2n โดยที่ n ≥ m อย่างไรก็ตาม เศษส่วนทศนิยมส่วนใหญ่ เช่น 0.1 หรือ 0.123 เป็น เศษส่วนซ้ำ อนันต์ ในฐาน 2 ดังนั้นจึงไม่สามารถแสดงด้วยวิธีนั้นได้