(Hoàn thành) Hư?ng d?n đ? hi?u IEEE Floating-Point l?i

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 42980 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

D?u ch?m đ?ng toán h?c là m?t ch? đ? ph?c t?p confuses nhi?u các l?p tr?nh viên. Các hư?ng d?n dư?i đây s? giúp b?n nh?n ra l?p tr?nh t?nh hu?ng nơi l?i d?u ch?m đ?ng có kh? năng x?y ra và làm th? nào đ? tránh cho h?. Nó c?ng nên cho phép b?n đ? nh?n ra đư?c các trư?ng h?p do h?n ch? v?n có d?u ch?m đ?ng toán như trái ngư?c v?i th?c t? biên d?ch l?i.

THÔNG TIN THÊM

Th?p phân và h? th?ng s? nh? phân

Thông thư?ng, chúng tôi truy c?p nh?ng th? trong căn c? 10. Cơ s? là hoàn toàn tùy ?. L? do ch? có ngư?i dân có truy?n th?ng s? d?ng căn c? 10 là h? có 10 ngón tay, khi?n có ti?n d?ng đ?m công c?.

S? 532.25 trong th?p phân (10 cơ s?) có ngh?a là sau đây:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Trong s? h? đôi (cơ s? 2), m?i c?t đ?i di?n cho m?t quy?n l?c 2 thay v? c?a 10. Ví d?, m?t s? 101.01 có ngh?a là các sau:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Làm th? nào s? nguyên đư?c đ?i di?n trong các máy tính

V? không có m?t ph?n phân đo?n đ? m?t s? nguyên, máy c?a nó đ?i di?n là đơn gi?n hơn nhi?u so v?i nó là giá tr? d?u ch?m đ?ng. Normal s? nguyên trên máy tính cá nhân (PC) là 2 byte (16 bit) dài v?i các bit quan tr?ng nh?t cho th?y các d?u hi?u. Lâu dài nguyên là 4 byte dài. Giá tr? tích c?c là đơn gi?n s? nh? phân. Ví dụ:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Tuy nhiên, s? nguyên âm đư?c đ?i di?n b?ng cách s? d?ng c?a hai b? ng? đ? án. Đ? có đư?c c?a hai b? sung đ?i di?n cho m?t tiêu c?c s?, m?t nh? phân đ?i di?n cho m?t s? giá tr? tuy?t đ?i và sau đó l?t t?t c? các bit và thêm 1. Ví dụ:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Lưu ? r?ng -1 th?p phân = 1111 1111 1111 1111 trong h? nh? phân, mà gi?i thích l? do t?i sao Basic x? l? -1 là h?p l? đúng (t?t c? các bit = 1). Đây là m?t h?u qu? c?a vi?c không có nhà khai thác riêng bi?t cho bit và h?p l? so sánh. Thư?ng trong Basic, r?t thu?n ti?n đ? s? d?ng đo?n m? dư?i đây khi chương tr?nh c?a b?n s? làm cho nhi?u so sánh h?p l?. Đi?u này r?t nhi?u vi?n tr? d? đ?c.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Lưu ? r?ng vi?c thêm b?t k? s? k?t h?p c?a hai b? sung cho s? v?i nhau b?ng cách s? d?ng b?nh thư?ng nh? phân c?p hàng s? s?n xu?t k?t qu? chính xác.

D?u ch?m đ?ng bi?n ch?ng

M?i s? nguyên th?p phân có th? đư?c chính xác đư?c đ?i di?n b?i m?t s? nguyên dương nh? phân; Tuy nhiên, đi?u này là không đúng cho các con s? phân đo?n. Trong th?c t?, m?i s? lư?ng là chưa h?p l? trong cơ s? 10 c?ng s? đư?c chưa h?p l? trong b?t k? h? th?ng v?i m?t cơ s? nh? hơn 10.

Cho nh? phân, trong đó, phân đo?n ch? s? có th? đ?i di?n trong m?u p/q, nơi q là m?t s? nguyên s?c m?nh c?a 2, có th? bày t? s? chính xác, v?i m?t s? h?u h?n các bit.

Th?m chí ph? bi?n liên phân s? th?p phân, ch?ng h?n như 0,0001 th?p phân, không th? đ?i di?n chính xác trong h? nh? phân. (0,0001 là m?t l?p l?i nh? phân ph?n v?i m?t kho?ng th?i gian c?a 104 bit!)

Đi?u này gi?i thích l? do t?i sao m?t ví d? đơn gi?n, ch?ng h?n như sau
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

s? in 1.000054 như s?n lư?ng. L?i nh? trong đ?i di?n cho 0,0001 trong h? nh? phân Lan truy?n v?i t?ng.

Đ?i v?i l? do đó, b?n nên luôn luôn r?t th?n tr?ng khi th?c hi?n so sánh v? s? th?c. Ví d? sau minh ho? m?t l?i l?p tr?nh ph? bi?n:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Đi?u này s? không in "s? b?nh đ?ng!" b?i v? 69.82 không th? đư?c đ?i di?n chính xác trong h? nh? phân, mà nguyên nhân giá tr? mà k?t qu? t? các chuy?n như?ng là hơi khác nhau (trong h? nh? phân) so v?i giá tr? nh? đư?c t?o ra t? các bi?u hi?n. Trong th?c t?, b?n nên luôn luôn m? s? so sánh như v?y theo cách cho phép cho m?t s? dung sai. Cho Ví d?:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Đi?u này s? in "B?ng".

IEEE đ?nh d?ng s?

QuickBasic cho MS-DOS, phiên b?n 3.0 đ? đư?c v?n chuy?n v?i m?t MBF Phiên b?n (Microsoft đôi n?i đi?m) và m?t IEEE (vi?n Đi?n và đi?n t? k? sư) Phiên b?n cho máy v?i m?t coprocessor toán. QuickBasic cho MS-DOS, phiên b?n 4.0 và sau này ch? s? d?ng IEEE. Microsoft đ? ch?n các tiêu chu?n IEEE đ? đ?i di?n cho floating-point giá tr? trong phiên b?n hi?n t?i c?a cơ b?n đ?i v?i các chi ti?t ba l? do chính:
  1. Đ? cho phép cơ b?n đ? s? d?ng Intel toán coprocessors, s? d?ng IEEE đ?nh d?ng. Intel 80 x 87 lo?t coprocessors không th? làm vi?c v?i Microsoft đ?nh d?ng nh? phân s?.
  2. Đ? làm cho interlanguage g?i gi?a Basic, C, Pascal, FORTRAN, và MASM d? dàng hơn nhi?u. N?u không, công vi?c chuy?n đ?i s? ph?i đư?c s? d?ng đ? g?i các giá tr? s? t? m?t ngôn ng? khác.
  3. Đ? đ?t đư?c nh?t quán. IEEE là tiêu chu?n cho công nghi?p đư?c ch?p nh?n Tr?nh biên d?ch c và FORTRAN.
Dư?i đây là m?t so sánh nhanh chóng c?a IEEE và MBF đ?i di?n Đ?i v?i m?t s? đôi chính xác:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Cho bi?t thêm thông tin v? s? khác nhau gi?a IEEE và MBF d?u ch?m đ?ng đ?i di?n, truy v?n trong cơ s? ki?n th?c Microsoft ngày các t? sau đây:
   IEEE and floating and point and appnote
				

Lưu ? r?ng IEEE có thêm bit dành riêng cho s? m?, cho phép nó đ?i di?n cho m?t ph?m vi r?ng hơn c?a các giá tr?. MBF có b? mantissa bit, cho phép nó đ? chính xác hơn trong ph?m vi h?p hơn.

T?ng quát khái ni?m d?u ch?m đ?ng

Nó là r?t quan tr?ng đ? nh?n ra r?ng b?t k? h? th?ng nh? phân, d?u ch?m đ?ng có th? đ?i di?n cho ch? là m?t s? h?u h?n các giá tr? d?u ch?m đ?ng trong chính xác h?nh th?c. T?t c? các giá tr? khác ph?i đư?c ư?c ch?ng b?ng g?n nh?t giá tr? USD. IEEE tiêu chu?n xác đ?nh phương pháp cho làm tr?n các giá tr? v?i giá tr? USD "g?n". QuickBasic Đ?i v?i MS-DOS h? tr? các tiêu chu?n và các v?ng Theo đi?u c?a IEEE quy t?c.

Ngoài ra, h?y nh? r?ng nh?ng con s? có th? đư?c bi?u di?n trong IEEE đang lan r?ng trên m?t ph?m vi r?t r?ng. B?n có th? tư?ng tư?ng h? vào m?t s? d?ng. Đó là m?t m?t đ? cao c?a các con s? USD g?n 1.0 và-1.0 nhưng ít hơn và ít hơn như b?n đi theo hư?ng 0 ho?c vô c?c.

M?c đích c?a các tiêu chu?n IEEE, đư?c thi?t k? cho k? thu?t tính toán, là đ? t?i đa hóa đ? chính xác (đ? có đư?c càng g?n càng t?t đ? con s? th?c t?). Dùng chính xác đ? ch? s? ch? s? mà b?n có th? đ?i di?n cho. Tiêu chu?n IEEE c? g?ng đ? cân b?ng s? lư?ng bit dành riêng cho s? m? v?i s? bit đư?c s? d?ng cho các m?t ph?n phân đo?n c?a s?, đ? gi? cho đ? chính xác và đ? chính xác trong gi?i h?n ch?p nh?n đư?c.

IEEE chi ti?t

Các con s? d?u ch?m đ?ng đư?c đ?i di?n trong các h?nh th?c sau đây, nơi [s? m?] là s? m? nh? phân:
   X =  Fraction * 2^(exponent - bias)
				

[Ph?n nh?] là m?t ph?n phân đo?n b?nh thư?ng c?a s?, đư?c chu?n hoá b?i v? s? m? đư?c đi?u ch?nh đ? cho bit hàng đ?u luôn luôn là m?t 1. Này b?ng cách nào, nó không ph?i đư?c lưu tr?, và b?n có đư?c m?t chút thêm c?a chính xác. Đây là l? do t?i sao đó là m?t chút ng? ?. B?n có th? ngh? đ?n Đi?u này gi?ng như khoa h?c k? hi?u, nơi b?n thao tác s? m? đ? có m?t ch? s? bên trái c?a đi?m th?p phân, ngo?i tr? trong h? nh? phân, b?n luôn luôn có th? thao tác s? m? v? v?y mà bit đ?u tiên là m?t 1, t? đó không có duy nh?t 1 và 0s.

[thiên v?] là giá tr? bias đư?c s? d?ng đ? tránh vi?c ph?i lưu tr? tiêu c?c s? m?.

Xu hư?ng cho đ?a đơn chính xác s? là 127 và 1023 (th?p phân) cho các con s? chính xác kép.

Các giá tr? b?ng 0 t?t c? và t?t c? c?a 1 (nh? phân) đư?c dành riêng cho đ?i di?n cho trư?ng h?p đ?c bi?t. Có nh?ng trư?ng h?p đ?c bi?t khác là t?t, mà ch? ra đi?u ki?n l?i khác nhau.

Single-Precision ví d?

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hex
Lưu ? d?u hi?u chút là zero, và đư?c lưu tr? s? m? là 128, ho?c 100 0000 0 trong h? nh? phân, mà là 127 c?ng v?i 1. Mantissa đư?c lưu tr? là (1.) 000 0000... 0000 0000, trong đó có m?t ng? ? hàng đ?u 1 và nh? phân đi?m, do đó, th?c t? mantissa là 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Tương t? như + 2 tr? là d?u hi?u bit đư?c thi?t l?p. Đi?u này là đúng cho t?t c? IEEE đ?nh d?ng d?u ch?m đ?ng s? đi?n tho?i.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex
Mantissa cùng, s? m? tăng m?t (giá tr? thiên v? là 129, ho?c 100 0000 1 trong h? nh? phân.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Cùng m?t s? m?, mantissa là l?n hơn m?t n?a - nó là (1.) 100 0000... 0000 0000, mà, v? đây là m?t đôi ph?n nh?, là 1-1/2 (các giá tr? c?a ch? s? phân đo?n là 1/2, 1/4, 1/8, v.v..).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Cùng m?t s? m? như các quy?n h?n c?a 2, mantissa là m?t trong ít hơn 2 127, ho?c 011 1111 1 trong h? nh? phân.

.75 = 1,5 * 2 ^ -1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
S? m? thiên v? là 126, 011 1111 0 trong nh? phân, và mantissa là (1.) 100 0000... 0000 0000, đó là 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... hex 0000 0000 0000 = 4020
Chính xác gi?ng như 2 ngo?i tr? r?ng bit mà đ?i di?n cho 1/4 là thi?t l?p trong mantissa.

0,1 = 1.6 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 là m?t ph?n nh? trong l?p l?i trong h? nh? phân. Mantissa là ch? nhút nhát c?a 1.6, và s? m? thành ki?n nói r?ng 1,6 đ? đư?c chia cho 16 (nó là 011 1101 1 trong h? nh? phân, mà là 123 trong th?p phân). S? th?t s? m? là 123-127 = - 4, có ngh?a là các y?u t? mà nhân là 2 ** -4 = 1/16. Lưu ? r?ng mantissa đư?c lưu tr? làm tr?n lên trong bit cu?i cùng. Đây là m?t n? l?c đ? đ?i di?n cho các unrepresentable s? chính xác càng t?t. (L? do mà 1/10 và 1/100 là không chính xác USD trong h? nh? phân là tương t? như cách 1/3 là không chính xác USD trong th?p phân.)

0 = 1.0 * 2 ^-128 = t?t c? các Zero - m?t trư?ng h?p đ?c bi?t.

L?i d?u ch?m đ?ng ph? bi?n khác

Sau đây là l?i d?u ch?m đ?ng ph? bi?n:
  1. V?ng t?t l?i

    L?i này k?t qu? khi t?t c? các bit trong m?t s? nh? phân không th? đư?c s? d?ng trong tính toán m?t.

    Ví d?: Thêm 0,0001 đ? 0.9900 (đơn chính xác)

    Th?p phân 0,0001 s? đư?c đ?i di?n như:
    (1.) 10100011011011100010111 * 2^(-14+Bias) (13 d?n 1s trong Binary!)
    0.9900 s? đư?c đ?i di?n như:
    (1.) 11111010111000010100011 * 2^(-1+Bias)
    Bây gi? th?c s? thêm nh?ng con s? này, các đi?m (nh? phân) th?p phân ph?i đư?c liên k?t. Đ?i v?i đi?u này, h? ph?i Unnormalized. Dư?i đây là các b? sung k?t qu?:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Đi?u này đư?c g?i là m?t v?ng ra l?i b?i v? m?t s? máy tính v?ng khi chuy?n cho b? sung. Nh?ng ngư?i khác ch? đơn gi?n là truncate. V?ng t?t l?i là quan tr?ng đ? xem xét b?t c? khi nào b?n đang thêm ho?c nhân hai giá tr? r?t khác nhau.
  2. Subtracting hai g?n như b?ng các giá tr?
           .1235
          -.1234
           _____
           .0001
    
    						
    Đi?u này s? đư?c chu?n hoá. Lưu ? r?ng m?c dù nh?ng con s? g?c m?i ngư?i có b?n ch? s? quan tr?ng, k?t qu? đ? ch? có m?t ch? s? đáng k?.
  3. Tràn và underflow

    Đi?u này x?y ra khi k?t qu? là quá l?n ho?c quá nh? đ? đ?i di?n b?i ki?u d? li?u.
  4. Quantizing l?i

    Đi?u này x?y ra v?i nh?ng con s? mà không th? đư?c đ?i di?n trong chính xác h?nh th?c b?i các tiêu chu?n d?u ch?m đ?ng.
  5. B? ph?n c?a m?t s? lư?ng r?t nh?

    Đi?u này có th? kích ho?t m?t l?i "phân chia b?i zero" ho?c có th? s?n xu?t x?u k?t qu?, như trong ví d? sau:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    Trong QuickBasic cho MS-DOS, X bây gi? có giá tr? 888887, thay v? câu tr? l?i đúng, 900000.
  6. Đ?u ra l?i

    Lo?i l?i x?y ra khi thay đ?i các ch?c năng s?n lư?ng các giá tr? h? đang làm vi?c v?i.

Thu?c tính

ID c?a bài: 42980 - L?n xem xét sau cùng: 17 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
T? khóa: 
kbmt KB42980 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:42980
Khước từ Nội dung trong Cơ sở Kiến thức Không còn được hỗ trợ
Bài vi?t này nói v? các s?n ph?m mà Microsoft không c?n h? tr? n?a. Do đó, bài vi?t này đư?c cung c?p "nguyên b?n" và s? không đư?c c?p nh?t.

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com