Sự khác biệt giữa một hoạt động điểm nổi chính xác đơn và chính xác kép là gì?


168

Sự khác biệt giữa một hoạt động điểm nổi chính xác duy nhất và hoạt động nổi chính xác kép là gì?

Tôi đặc biệt quan tâm đến các điều khoản thực tế liên quan đến máy chơi game video. Ví dụ, Nintendo 64 có bộ xử lý 64 bit không và nếu có thì điều đó có nghĩa là nó có khả năng hoạt động điểm nổi chính xác gấp đôi? PS3 và Xbox 360 có thể thực hiện các hoạt động điểm nổi chính xác kép hay chỉ độ chính xác đơn và sử dụng chung là các khả năng chính xác kép được sử dụng (nếu chúng tồn tại?).


17
Thực tế là CPU là 64 bit thường có nghĩa là CPU có các thanh ghi mục đích chung 64 bit (tức là số nguyên) và kích thước địa chỉ bộ nhớ . Nhưng nó không nói gì về toán học dấu phẩy động. Ví dụ, CPU Intel IA-32 là 32 bit, nhưng chúng thực sự hỗ trợ các phao chính xác kép.
Roman Zavalov

Câu trả lời:


215

Lưu ý: Tuy nhiên, Nintendo 64 có bộ xử lý 64 bit:

Nhiều trò chơi đã tận dụng chế độ xử lý 32 bit của chip vì độ chính xác dữ liệu lớn hơn có sẵn với các loại dữ liệu 64 bit thường không được các trò chơi 3D yêu cầu, cũng như việc xử lý dữ liệu 64 bit sử dụng gấp đôi RAM, bộ nhớ cache và băng thông, do đó làm giảm hiệu suất hệ thống tổng thể.

Từ trang web :

Thuật ngữ độ chính xác kép là một cái gì đó sai lầm vì độ chính xác không thực sự gấp đôi.
Từ kép xuất phát từ thực tế là một số có độ chính xác kép sử dụng gấp đôi số bit so với số dấu phẩy động thông thường.
Ví dụ: nếu một số có độ chính xác đơn yêu cầu 32 bit, thì đối tác có độ chính xác kép của nó sẽ dài 64 bit.

Các bit bổ sung không chỉ tăng độ chính xác mà còn cả phạm vi độ lớn có thể được biểu diễn.
Số lượng chính xác theo đó độ chính xác và phạm vi cường độ được tăng lên tùy thuộc vào định dạng mà chương trình đang sử dụng để biểu thị các giá trị dấu phẩy động.
Hầu hết các máy tính sử dụng định dạng chuẩn được gọi là định dạng dấu phẩy động của IEEE.

IEEE định dạng kép chính xác thực sự có nhiều hơn gấp đôi so với nhiêu bit chính xác như là định dạng chính xác đơn, cũng như một loạt lớn hơn nhiều.

Từ tiêu chuẩn IEEE cho số học dấu phẩy động

Độ chính xác đơn

Biểu diễn tiêu chuẩn điểm nổi chính xác duy nhất của IEEE yêu cầu một từ 32 bit, có thể được biểu diễn dưới dạng được đánh số từ 0 đến 31, từ trái sang phải.

  • Bit đầu tiên là bit dấu , S,
  • tám bit tiếp theo là các bit số mũ , 'E' và
  • 23 bit cuối cùng là phân số 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

Giá trị V được biểu thị bằng từ có thể được xác định như sau:

  • Nếu E = 255 và F là khác không, thì V = NaN ("Không phải là số")
  • Nếu E = 255 và F bằng 0 và S là 1, thì V = -Infinity
  • Nếu E = 255 và F bằng 0 và S bằng 0, thì V = Infinity
  • Nếu 0<E<255sau đó V=(-1)**S * 2 ** (E-127) * (1.F)"1.F" được dùng để biểu thị số nhị phân được tạo bằng tiền tố F với số 1 ẩn và điểm nhị phân.
  • Nếu E = 0 và F là khác không, thì V=(-1)**S * 2 ** (-126) * (0.F). Đây là những giá trị "không chuẩn hóa".
  • Nếu E = 0 và F bằng 0 và S bằng 1, thì V = -0
  • Nếu E = 0 và F bằng 0 và S bằng 0, thì V = 0

Đặc biệt,

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)

Độ chính xác kép

Biểu diễn tiêu chuẩn điểm nổi chính xác kép của IEEE yêu cầu một từ 64 bit, có thể được biểu diễn dưới dạng số từ 0 đến 63, từ trái sang phải.

  • Bit đầu tiên là bit dấu , S,
  • mười một bit tiếp theo là các bit số mũ , 'E' và
  • 52 bit cuối cùng là phân số 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

Giá trị V được biểu thị bằng từ có thể được xác định như sau:

  • Nếu E = 2047 và F là khác không, thì V = NaN ("Không phải là số")
  • Nếu E = 2047 và F bằng 0 và S là 1, thì V = -Infinity
  • Nếu E = 2047 và F bằng 0 và S bằng 0, thì V = Infinity
  • Nếu 0<E<2047sau đó V=(-1)**S * 2 ** (E-1023) * (1.F)"1.F" được dùng để biểu thị số nhị phân được tạo bằng tiền tố F với số 1 ẩn và điểm nhị phân.
  • Nếu E = 0 và F là khác không, thì V=(-1)**S * 2 ** (-1022) * (0.F)đây là các giá trị "không chuẩn hóa".
  • Nếu E = 0 và F bằng 0 và S bằng 1, thì V = -0
  • Nếu E = 0 và F bằng 0 và S bằng 0, thì V = 0

Tham khảo:
ANSI / IEEE Standard 754-1985,
Tiêu chuẩn cho số học dấu phẩy động nhị phân.


9
Tôi biết rằng điều này từ nguồn của bạn, nhưng tôi không thích câu: "Thuật ngữ độ chính xác kép là một cái gì đó sai lầm vì độ chính xác không thực sự gấp đôi." Độ chính xác đơn và đôi ngày nay được định nghĩa khá phổ biến bởi IEEE và khi bạn chỉ ra độ chính xác đơn có 23 bit trong phân số và gấp đôi có 52 bit - về cơ bản là gấp đôi độ chính xác ...
Carl Walsh

5
@ZeroDivide ' **' là lũy thừa
VonC

11
@CarlWalsh 52/23! = 2 ergo nó không "nhân đôi độ chính xác"
rfoo

@johnson Bạn có thêm chi tiết về các giá trị không chuẩn hóa trong easy68k.com/paulrsm/6502/WOZFPPAK.TXT , và trong stackoverflow.com/a/28801033/6309
VonC

2
@rfoo Nếu bạn muốn chắc chắn về phạm vi, nó không chính xác gấp đôi, nhưng 52/2> 23 vì vậy, đó là gấp đôi độ chính xác, nó chỉ tăng gấp đôi và sau đó thêm một số.
JShorthouse

41

Tôi đã đọc rất nhiều câu trả lời nhưng dường như không ai giải thích chính xác từ " double" xuất phát từ đâu. Tôi nhớ một lời giải thích rất hay được đưa ra bởi một giáo sư đại học mà tôi đã có vài năm trước.

Nhắc lại phong cách trả lời của VonC, một biểu diễn dấu phẩy động chính xác duy nhất sử dụng một từ 32 bit.

  • 1 bit cho dấu , S
  • 8 bit cho số mũ , 'E'
  • 24 bit cho phân số , còn được gọi là mantissa hoặc hệ số (mặc dù chỉ có 23 được biểu diễn). Chúng ta hãy gọi nó là 'M' (đối với mantissa , tôi thích tên này là "phân số" có thể bị hiểu nhầm).

Đại diện:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Chỉ cần chỉ ra, bit dấu là cuối cùng, không phải đầu tiên.)

Một biểu diễn dấu phẩy động chính xác kép sử dụng một từ 64 bit.

  • 1 bit cho dấu , S
  • 11 bit cho số mũ , 'E'
  • 53 bit cho phân số / mantissa / hệ số (mặc dù chỉ có 52 được đại diện), 'M'

Đại diện:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Như bạn có thể nhận thấy, tôi đã viết rằng mantissa , trong cả hai loại, có thêm một chút thông tin so với đại diện của nó. Trong thực tế, mantissa là một số đại diện mà không có tất cả không có ý nghĩa của nó 0. Ví dụ,

  • 0,000124 trở thành 0,125 × 10 3
  • 237.141 trở thành 0.237141 × 10 3

Điều này có nghĩa là bọ ngựa sẽ luôn ở dạng

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

trong đó là cơ sở của đại diện. Nhưng vì phân số là số nhị phân, nên 1 1 sẽ luôn bằng 1, do đó phân số có thể được viết lại thành 1.α 2 α 3 ... α t + 1 × 2 p và 1 ban đầu có thể được giả định, nhường chỗ cho một bit thừa (α t + 1 ).

Bây giờ, rõ ràng là gấp đôi số 32 là 64, nhưng đó không phải là từ có nguồn gốc.

Độ chính xác cho biết số chữ số thập phân là chính xác , nghĩa là không có bất kỳ loại lỗi đại diện hoặc xấp xỉ nào. Nói cách khác, nó cho biết có bao nhiêu chữ số thập phân người ta có thể sử dụng một cách an toàn .

Như đã nói, thật dễ dàng để ước tính số chữ số thập phân có thể được sử dụng một cách an toàn:

  • độ chính xác duy nhất : log 10 (2 24 ), có khoảng 7 ~ 8 chữ số thập phân
  • độ chính xác kép : log 10 (2 53 ), có khoảng 15 ~ 16 chữ số thập phân

19

Được rồi, sự khác biệt cơ bản tại máy là độ chính xác gấp đôi sử dụng gấp đôi số bit so với đơn. Trong cách thực hiện thông thường, đó là 32 bit cho đơn, 64 bit cho gấp đôi.

Nhưng điều đó có nghĩa là gì? Nếu chúng ta giả sử tiêu chuẩn IEEE, thì một số chính xác duy nhất có khoảng 23 bit của lớp phủ và số mũ tối đa khoảng 38; độ chính xác kép có 52 bit cho lớp phủ và số mũ tối đa khoảng 308.

Các chi tiết có tại Wikipedia , như thường lệ.


11

Để thêm vào tất cả các câu trả lời tuyệt vời ở đây

Trước hết, floatdouble đều được sử dụng để biểu diễn các số phân số. Vì vậy, sự khác biệt giữa hai nguồn gốc từ thực tế với độ chính xác mà chúng có thể lưu trữ các con số.

Ví dụ: Tôi phải lưu trữ 123,456789 Một người chỉ có thể lưu trữ 123,4567 trong khi những người khác có thể lưu trữ chính xác 123,456789.

Vì vậy, về cơ bản chúng tôi muốn biết con số có thể được lưu trữ chính xác đến mức nào và là cái mà chúng tôi gọi là độ chính xác.

Trích dẫn @Alessandro tại đây

Độ chính xác cho biết số chữ số thập phân là chính xác , nghĩa là không có bất kỳ loại lỗi đại diện hoặc xấp xỉ nào. Nói cách khác, nó cho biết có bao nhiêu chữ số thập phân người ta có thể sử dụng một cách an toàn .

Float có thể lưu trữ chính xác khoảng 7-8 chữ số trong phần phân số trong khi Double có thể lưu trữ chính xác khoảng 15-16 chữ số trong phần phân số

Vì vậy, float có thể lưu trữ gấp đôi số lượng phân số. Đó là lý do Double được gọi là gấp đôi số float


7

Đối với câu hỏi "ps3 và xbxo 360 có thể thực hiện các hoạt động điểm nổi chính xác kép hay chỉ độ chính xác đơn và sử dụng chung là các khả năng chính xác kép được sử dụng (nếu chúng tồn tại?)."

Tôi tin rằng cả hai nền tảng đều không có khả năng điểm nổi gấp đôi. Bộ xử lý Cell ban đầu chỉ có 32 bit float, giống với phần cứng ATI mà XBox 360 dựa trên (R600). Cell có hỗ trợ điểm nổi gấp đôi sau này, nhưng tôi khá chắc chắn rằng PS3 không sử dụng chippery đó.


5

Về cơ bản, số học điểm nổi chính xác duy nhất xử lý các số dấu phẩy động 32 bit trong khi độ chính xác gấp đôi với 64 bit.

Số lượng bit trong độ chính xác kép làm tăng giá trị tối đa có thể được lưu trữ cũng như tăng độ chính xác (nghĩa là số lượng chữ số có nghĩa).


5

Tất cả đã giải thích rất chi tiết và không có gì tôi có thể thêm vào. Mặc dù tôi muốn giải thích điều đó trong Điều khoản của Layman hoặc TIẾNG VIỆT

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

.....

Một biến, có thể lưu trữ hoặc đại diện cho "1.9" cung cấp độ chính xác thấp hơn so với biến có thể giữ hoặc đại diện cho 1.9999. Các phân số này có thể lên tới một sự khác biệt rất lớn trong các tính toán lớn.


2

Độ chính xác kép có nghĩa là các số mất gấp đôi độ dài từ để lưu trữ. Trên bộ xử lý 32 bit, các từ đều là 32 bit, do đó, nhân đôi là 64 bit. Điều này có nghĩa là về mặt hiệu suất là các hoạt động trên các số chính xác kép mất nhiều thời gian hơn để thực hiện. Vì vậy, bạn có được một phạm vi tốt hơn, nhưng có một điểm nhấn nhỏ về hiệu suất. Lượt truy cập này được giảm nhẹ một chút bởi các đơn vị điểm nổi phần cứng, nhưng nó vẫn còn đó.

N64 đã sử dụng một chiếc NEC VR4300 dựa trên MIPS R4300i, là bộ xử lý 64 bit, nhưng bộ xử lý giao tiếp với phần còn lại của hệ thống qua một bus rộng 32 bit. Vì vậy, hầu hết các nhà phát triển đã sử dụng số 32 bit vì chúng nhanh hơn và hầu hết các trò chơi vào thời điểm đó không cần độ chính xác bổ sung (vì vậy họ đã sử dụng số float không tăng gấp đôi).

Tất cả ba hệ thống có thể thực hiện các hoạt động nổi chính xác đơn và kép, nhưng chúng có thể không phải do hiệu suất. (mặc dù mọi thứ khá nhiều sau khi n64 sử dụng bus 32 bit nên ...)


1

Trước hết, float và double đều được sử dụng để biểu diễn các số phân số. Vì vậy, sự khác biệt giữa hai nguồn gốc từ thực tế với độ chính xác mà chúng có thể lưu trữ các con số.

Ví dụ: Tôi phải lưu trữ 123,456789 Một người chỉ có thể lưu trữ 123,4567 trong khi những người khác có thể lưu trữ chính xác 123,456789.

Vì vậy, về cơ bản chúng tôi muốn biết con số có thể được lưu trữ chính xác đến mức nào và là cái mà chúng tôi gọi là độ chính xác.

Trích dẫn @Alessandro tại đây

Độ chính xác cho biết số chữ số thập phân là chính xác, nghĩa là không có bất kỳ loại lỗi đại diện hoặc xấp xỉ nào. Nói cách khác, nó cho biết có bao nhiêu chữ số thập phân người ta có thể sử dụng một cách an toàn.

Float có thể lưu trữ chính xác khoảng 7-8 chữ số trong phần phân số trong khi Double có thể lưu trữ chính xác khoảng 15-16 chữ số trong phần phân số

Vì vậy, gấp đôi có thể lưu trữ gấp đôi số lượng phân số như phao. Đó là lý do Double được gọi là gấp đôi số float


0

Theo tiêu chuẩn IEEE754 • Tiêu chuẩn cho lưu trữ dấu phẩy động • Tiêu chuẩn 32 và 64 bit (độ chính xác đơn và độ chính xác kép) • Số mũ 8 và 11 bit tương ứng • Định dạng mở rộng (cả mantissa và số mũ) cho kết quả trung gian


-3

Số chính xác đơn sử dụng 32 bit, với MSB là bit dấu, trong khi số chính xác kép sử dụng 64 bit, MSB là bit dấu

Độ chính xác đơn

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Độ chính xác kép:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.