อะไรคือความแตกต่างระหว่างการดำเนินการจุดเดียวที่มีความแม่นยำและความแม่นยำสองเท่า


169

อะไรคือความแตกต่างระหว่างการดำเนินการจุดที่มีความแม่นยำเดียวและการดำเนินการที่มีความแม่นยำสองเท่า

ฉันสนใจโดยเฉพาะอย่างยิ่งในแง่การปฏิบัติที่เกี่ยวข้องกับเครื่องเล่นวิดีโอเกม ตัวอย่างเช่น Nintendo 64 มีตัวประมวลผล 64 บิตหรือไม่และหากเป็นเช่นนั้นหมายความว่าสามารถดำเนินการกับจุดที่มีความแม่นยำสูงได้หรือไม่ PS3 และ Xbox 360 สามารถดึงการดำเนินการจุดลอยตัวที่มีความแม่นยำสองเท่าหรือเฉพาะความแม่นยำเพียงอย่างเดียวและโดยทั่วไปแล้วคือความสามารถในการใช้ความแม่นยำสองเท่าที่มีการใช้งาน (หากมีอยู่)


17
ความจริงที่ว่ามี CPU 64 บิตมักจะหมายถึง CPU ที่มี 64 บิตลงทะเบียนอเนกประสงค์ (เช่นจำนวนเต็ม) และขนาดหน่วยความจำที่อยู่ แต่มันไม่ได้พูดอะไรเกี่ยวกับคณิตศาสตร์จุดลอย ตัวอย่างเช่นซีพียู Intel IA-32 นั้นเป็นแบบ 32 บิต แต่ก็สนับสนุนความแม่นยำสองเท่า
Roman Zavalov

คำตอบ:


215

หมายเหตุ: Nintendo 64มีตัวประมวลผล 64 บิตอย่างไรก็ตาม:

เกมหลายเกมใช้ประโยชน์จากโหมดการประมวลผลแบบ 32 บิตของชิปเนื่องจากความแม่นยำของข้อมูลที่มากขึ้นที่มีอยู่กับชนิดข้อมูล 64 บิตนั้นไม่จำเป็นต้องใช้กับเกม 3D เช่นเดียวกับข้อเท็จจริงที่ว่าการประมวลผลข้อมูล 64 บิตใช้ RAM สองเท่าแคช และแบนด์วิดท์จึงลดประสิทธิภาพของระบบโดยรวม

จากWebopedia :

คำที่มีความแม่นยำสองเท่าเป็นสิ่งที่เรียกชื่อผิดเนื่องจากความแม่นยำไม่ได้เป็นสองเท่าจริงๆ
คำว่า double มาจากข้อเท็จจริงที่ว่าตัวเลขความแม่นยำสองเท่าใช้จำนวนบิตสองเท่าของตัวเลขทศนิยมปกติ
ตัวอย่างเช่นหากหมายเลขที่มีความแม่นยำเดียวต้องการ 32 บิตคู่ที่มีความแม่นยำสองเท่าจะยาว 64 บิต

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

รูปแบบมาตรฐาน IEEE แม่นยำสองจริงมีมากขึ้นกว่าสองเท่าบิตของความแม่นยำเป็นรูปแบบเดียวที่มีความแม่นยำเช่นเดียวกับช่วงที่มากขึ้น

จากมาตรฐาน IEEE สำหรับการคำนวณเลขทศนิยม

ความแม่นยำเดียว

การแทนค่ามาตรฐานความแม่นยำจุดเดียวของ IEEE เดี่ยวต้องใช้คำ 32 บิตซึ่งอาจแสดงเป็นตัวเลขตั้งแต่ 0 ถึง 31 จากซ้ายไปขวา

  • บิตแรกคือบิตเครื่องหมาย S
  • อีกแปดบิตถัดไปคือบิตเลขชี้กำลัง 'E' และ
  • 23 บิตสุดท้ายเป็นเศษส่วน 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

ค่า V ที่แทนด้วยคำอาจถูกกำหนดดังนี้:

  • ถ้า E = 255 และ F ไม่ใช่ศูนย์ดังนั้น V = NaN ("ไม่ใช่ตัวเลข")
  • ถ้า E = 255 และ F เป็นศูนย์และ S คือ 1 ดังนั้น V = -Infinity
  • ถ้า E = 255 และ F เป็นศูนย์และ S คือ 0 ดังนั้น V = อินฟินิตี้
  • หาก0<E<255แล้วV=(-1)**S * 2 ** (E-127) * (1.F)ที่ "1.F" มีวัตถุประสงค์เพื่อแทนเลขฐานสองที่สร้างขึ้นโดย prefixing F มีนัยชั้นนำที่ 1 และจุดไบนารี
  • ถ้า E = 0 และ F V=(-1)**S * 2 ** (-126) * (0.F)ไม่ใช่ศูนย์แล้ว เหล่านี้เป็นค่า "ผิดปกติ"
  • ถ้า E = 0 และ F เป็นศูนย์และ S คือ 1 ดังนั้น V = -0
  • ถ้า E = 0 และ F เป็นศูนย์และ S คือ 0 ดังนั้น V = 0

โดยเฉพาะอย่างยิ่ง,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

ความแม่นยำสองเท่า

การแทนค่ามาตรฐานทศนิยมที่มีความแม่นยำสองเท่าของ IEEE ต้องใช้คำ 64 บิตซึ่งอาจแสดงเป็นตัวเลขตั้งแต่ 0 ถึง 63 จากซ้ายไปขวา

  • บิตแรกคือบิตเครื่องหมาย S
  • บิตที่สิบเอ็ดถัดไปคือบิตเลขชี้กำลัง 'E' และ
  • 52 บิตสุดท้ายเป็นเศษส่วน 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

ค่า V ที่แทนด้วยคำอาจถูกกำหนดดังนี้:

  • ถ้า E = 2047 และ F ไม่ใช่ศูนย์ดังนั้น V = NaN ("ไม่ใช่ตัวเลข")
  • ถ้า E = 2047 และ F เป็นศูนย์และ S คือ 1 ดังนั้น V = -Infinity
  • ถ้า E = 2047 และ F เป็นศูนย์และ S คือ 0 ดังนั้น V = ไม่มีที่สิ้นสุด
  • หาก0<E<2047แล้วV=(-1)**S * 2 ** (E-1023) * (1.F)ที่ "1.F" มีวัตถุประสงค์เพื่อแทนเลขฐานสองที่สร้างขึ้นโดย prefixing F มีนัยชั้นนำที่ 1 และจุดไบนารี
  • ถ้า E = 0 และ F ไม่ใช่ศูนย์ดังนั้นค่าV=(-1)**S * 2 ** (-1022) * (0.F)เหล่านี้คือ "ผิดปกติ"
  • ถ้า E = 0 และ F เป็นศูนย์และ S คือ 1 ดังนั้น V = -0
  • ถ้า E = 0 และ F เป็นศูนย์และ S คือ 0 ดังนั้น V = 0

อ้างอิง:
มาตรฐาน ANSI / IEEE 754-1985,
มาตรฐานเลขฐานสองแบบเลขฐานสอง


9
ฉันรู้ว่าสิ่งนี้มาจากแหล่งที่มาของคุณ แต่ฉันไม่ชอบประโยค: "คำที่มีความแม่นยำสองเท่าเป็นสิ่งที่เรียกชื่อผิดเพราะความแม่นยำไม่ได้เป็นสองเท่าจริง ๆ " ความแม่นยำเดี่ยวและคู่วันนี้มีการกำหนดโดย IEEE ค่อนข้างสากลและในขณะที่คุณชี้ให้เห็นความแม่นยำเดียวมี 23 บิตในส่วนและสองมี 52 บิต - นั่นคือความแม่นยำเป็นสองเท่า ...
Carl Walsh

5
@ZeroDivide ' **' is Exponentiation
VonC

11
@CarlWalsh 52/23! = 2 ดังนั้นมันไม่ได้เป็น "ความแม่นยำเป็นสองเท่า"
rfoo

@johnson คุณมีรายละเอียดเพิ่มเติมเกี่ยวกับค่าที่ไม่เป็นปกติในeasy68k.com/paulrsm/6502/WOZFPPAK.TXTและในstackoverflow.com/a/28801033/6309
VonC

2
@rfoo ถ้าคุณต้องการที่จะอวดความมั่นใจมันไม่ได้เป็นสองเท่าอย่างแน่นอนแต่ 52/2> 23 ดังนั้นใช่มันเป็นความแม่นยำเป็นสองเท่ามันเป็นสองเท่าและมากกว่านั้นอีก
JShorthouse

42

ผมอ่านมากคำตอบ แต่ไม่มีดูเหมือนว่าจะอธิบายได้อย่างถูกต้องที่คำว่าคู่มาจาก ฉันจำคำอธิบายที่ดีมากที่อาจารย์มหาวิทยาลัยให้มาเมื่อหลายปีก่อน

การระลึกถึงสไตล์ของคำตอบของ VonC การแสดงจุดลอยตัวที่มีความแม่นยำเพียงอย่างเดียวใช้คำ 32 บิต

  • 1 บิตสำหรับเครื่องหมาย S
  • 8 บิตสำหรับเลขชี้กำลัง 'E'
  • 24 บิตสำหรับเศษส่วนหรือที่เรียกว่าmantissaหรือสัมประสิทธิ์ (แม้ว่าจะมีเพียง 23 แทน) ลองเรียกมันว่า 'M' (สำหรับmantissaฉันชอบชื่อนี้ว่า "เศษส่วน" สามารถเข้าใจผิดได้)

ตัวแทน:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(เพียงเพื่อชี้ให้เห็นว่าบิตการลงชื่อเป็นครั้งสุดท้ายไม่ใช่ครั้งแรก)

การแสดงจุดทศนิยมที่มีความแม่นยำสองเท่าใช้คำ 64 บิต

  • 1 บิตสำหรับเครื่องหมาย S
  • 11 บิตสำหรับเลขชี้กำลัง 'E'
  • 53 บิตสำหรับเศษส่วน / แมนทิสซา / ค่าสัมประสิทธิ์ (แม้ว่าจะแสดงเพียง 52 ค่า), 'M'

ตัวแทน:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

อย่างที่คุณอาจสังเกตเห็นว่าฉันเขียนว่าmantissaมีข้อมูลทั้งสองประเภทมากขึ้นเมื่อเทียบกับการเป็นตัวแทน ในความเป็นจริง mantissa เป็นจำนวนที่แสดงโดยไม่มีนัยสำคัญ0ทั้งหมด ตัวอย่างเช่น,

  • 0.000124 กลายเป็น 0.124 × 10 −3
  • 237.141 กลายเป็น 0.237141 × 10 3

ซึ่งหมายความว่าแมนทิสซาจะอยู่ในรูปแบบเสมอ

0.α 1 α 2 ... α t ×β p

โดยที่βเป็นฐานของการเป็นตัวแทน แต่เนื่องจากเศษส่วนเป็นเลขฐานสองα 1จะเท่ากับ 1 เสมอดังนั้นเศษส่วนสามารถเขียนใหม่เป็น1.α 2 α 3 ... α t + 1 × 2 pและ 1 เริ่มต้นสามารถสันนิษฐานได้โดยปริยาย ทำห้องสำหรับบิตพิเศษ (α t + 1 )

เห็นได้ชัดว่ามันเป็นความจริงที่ว่า double ของ 32 คือ 64 แต่นั่นไม่ใช่คำที่มาจากไหน

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

ด้วยที่กล่าวว่ามันง่ายที่จะประมาณจำนวนทศนิยมที่สามารถใช้งานได้อย่างปลอดภัย:

  • ความแม่นยำเดียว : บันทึก10 (2 24 ) ซึ่งประมาณ 7 ถึง 8 หลักทศนิยม
  • ความแม่นยำสองเท่า : บันทึก10 (2 53 ) ซึ่งประมาณ 15 ถึง 16 หลักทศนิยม

19

โอเคความแตกต่างพื้นฐานของเครื่องจักรก็คือความแม่นยำสองเท่านั้นใช้สองบิตมากเท่า ๆ กัน ในการนำไปปฏิบัติตามปกตินั่นคือ 32 บิตสำหรับเดี่ยว 64 บิตสำหรับสองเท่า

แต่นั่นหมายความว่าอย่างไร หากเราถือว่ามาตรฐาน IEEE แล้วจำนวนความแม่นยำเดียวจะมี mantissa ประมาณ 23 บิตและเลขชี้กำลังสูงสุดคือประมาณ 38; ความแม่นยำสองเท่ามี 52 บิตสำหรับแมนทิสซาและเลขชี้กำลังสูงสุดประมาณ 308

รายละเอียดอยู่ที่Wikipediaตามปกติ


11

เพื่อเพิ่มคำตอบที่ยอดเยี่ยมทั้งหมดที่นี่

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

ตัวอย่างเช่นฉันต้องเก็บ 123.456789 หนึ่งอาจเก็บเพียง 123.4567 ในขณะที่คนอื่นอาจเก็บ 123.456789 แน่นอน

ดังนั้นโดยพื้นฐานแล้วเราต้องการทราบจำนวนที่สามารถจัดเก็บได้อย่างแม่นยำและเป็นสิ่งที่เราเรียกว่าความแม่นยำ

อ้างถึง @Alessandro ที่นี่

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

Float สามารถเก็บเศษ 7-10 หลักได้อย่างแม่นยำในขณะที่ Double สามารถเก็บได้อย่างแม่นยำประมาณ 15-16 หลักในส่วนที่เป็นเศษส่วน

ดังนั้นการลอยสามารถเก็บปริมาณของส่วนที่เป็นเศษ นั่นคือเหตุผลที่ Double เรียกว่าdouble float


7

สำหรับคำถามที่ว่า "ps3 และ xbxo 360 สามารถดึงการดำเนินการจุดลอยตัวที่มีความแม่นยำสองเท่าหรือเฉพาะความแม่นยำเพียงอย่างเดียวและในการใช้งานทั่วไปคือความสามารถในการใช้ความแม่นยำสองเท่าที่ใช้

ฉันเชื่อว่าทั้งสองแพลตฟอร์มไม่สามารถใช้จุดลอยคู่ได้ โปรเซสเซอร์เซลล์ดั้งเดิมมีเพียง 32 บิตลอยเช่นเดียวกับฮาร์ดแวร์ของ ATI ซึ่ง XBox 360 เป็นพื้นฐาน (R600) Cell ได้รับการสนับสนุนเป็นทศนิยมสองเท่าในภายหลัง แต่ฉันค่อนข้างมั่นใจว่า PS3 ไม่ได้ใช้วิธีการโกง


5

เลขคณิตทศนิยมที่มีความแม่นยำเพียงอย่างเดียวโดยทั่วไปเกี่ยวข้องกับเลขทศนิยม 32 บิตในขณะที่ความแม่นยำสองครั้งเกี่ยวข้องกับ 64 บิต

จำนวนบิตในความแม่นยำสองเท่าจะเพิ่มค่าสูงสุดที่สามารถจัดเก็บได้รวมถึงการเพิ่มความแม่นยำ (เช่นจำนวนของตัวเลขที่มีนัยสำคัญ)


5

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

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

ตัวแปรที่สามารถจัดเก็บหรือแสดง "1.9" ให้ความแม่นยำน้อยกว่าที่สามารถถือหรือเป็นตัวแทน 1.9999 เศษส่วนเหล่านี้สามารถสร้างความแตกต่างอย่างมากในการคำนวณขนาดใหญ่


2

ความแม่นยำสองเท่าหมายถึงตัวเลขใช้ความยาวของคำสองเท่าในการจัดเก็บ บนตัวประมวลผล 32 บิตคำทั้งหมด 32 บิตดังนั้นคู่เป็น 64 บิต สิ่งนี้หมายความว่าในแง่ของประสิทธิภาพคือการดำเนินการกับตัวเลขที่มีความแม่นยำสองเท่าใช้เวลาดำเนินการนานกว่าเล็กน้อย ดังนั้นคุณจะได้รับช่วงที่ดีขึ้น แต่มีการแสดงที่ยอดเยี่ยมเล็กน้อย การโจมตีนี้ลดลงเล็กน้อยโดยหน่วยจุดลอยตัวฮาร์ดแวร์ แต่ยังคงอยู่ที่นั่น

N64 ใช้ NEC VR4300 ซึ่งใช้ MIPS R4300i ซึ่งเป็นโปรเซสเซอร์ 64 บิตแต่โปรเซสเซอร์สื่อสารกับส่วนที่เหลือของระบบผ่านบัสกว้าง 32 บิต ดังนั้นนักพัฒนาซอฟต์แวร์ส่วนใหญ่จึงใช้ตัวเลข 32 บิตเพราะเร็วกว่าและเกมส่วนใหญ่ในเวลานั้นไม่ต้องการความแม่นยำเพิ่มเติม

ทั้งสามระบบสามารถทำการลอยตัวแบบเดี่ยวและคู่ได้อย่างแม่นยำ แต่อาจไม่ใช่เพราะประสิทธิภาพ (แม้ว่าจะสวยมากทุกอย่างหลังจาก n64 ใช้บัส 32 บิตดังนั้น ... )


1

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

ตัวอย่างเช่นฉันต้องเก็บ 123.456789 หนึ่งอาจเก็บเพียง 123.4567 ในขณะที่คนอื่นอาจเก็บ 123.456789 แน่นอน

ดังนั้นโดยพื้นฐานแล้วเราต้องการทราบจำนวนที่สามารถจัดเก็บได้อย่างแม่นยำและเป็นสิ่งที่เราเรียกว่าความแม่นยำ

อ้างถึง @Alessandro ที่นี่

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

Float สามารถเก็บเศษ 7-10 หลักได้อย่างแม่นยำในขณะที่ Double สามารถเก็บได้อย่างแม่นยำประมาณ 15-16 หลักในส่วนที่เป็นเศษส่วน

ดังนั้น double สามารถเก็บปริมาณของส่วนที่เป็นเศษส่วนเป็นสองเท่าของ float ได้ นั่นคือเหตุผลที่ Double เรียกว่า double float


0

ตามมาตรฐาน IEEE754 •มาตรฐานสำหรับการจัดเก็บจุดลอยตัว•มาตรฐาน 32 และ 64 บิต (ความแม่นยำเดี่ยวและความแม่นยำสองเท่า) •เลขชี้กำลัง 8 และ 11 บิตตามลำดับ•รูปแบบเพิ่มเติม (ทั้งแมนทิสซาและเลขชี้กำลัง) สำหรับผลลัพธ์ระดับกลาง


-3

หมายเลขความแม่นยำเดี่ยวใช้ 32 บิตโดย MSB เป็นบิตขณะที่หมายเลขความแม่นยำสองเท่าใช้ 64 บิตบิต MSB เป็นบิต

ความแม่นยำเดี่ยว

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

ความแม่นยำสองเท่า:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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