Dijkstra June 2018 | Page 26

bit fraction , ta lại càng có độ chính xác cao hơn .
Các thành phần của số floating point và số lượng bit
Tuỳ theo từng loại giá trị mà một số floating point muốn biểu thị , ta có mối liên hệ giữa 3 phần trên khác nhau :
• Normalized form
◆◆ Sign : 0 hoặc 1
◆◆
Exponent : bất kì số nào , ngoại trừ trường hợp [ 11 .. 1 ] m hoặc [ 00 .. 0 ] m
◆◆ Fraction : bất kì số nào
◆◆ Số thực = ( -1) sign x 2 exponent-bias x ( 0 . F 1
F 2
F 3
... F n ) trong đó bias = 2 m-1 - 1
• Denormalized form
◆◆ Sign : 0 hoặc 1
◆◆ Exponent : luôn luôn [ 00 .. 0 ] m
◆◆ Fraction : bất kì số nào , ngoại trừ [ 00 .. 0 ] n
◆◆ Số thực = ( -1) sign x2 1-bias x ( 0 . F 1
F 2
F 3
.. F n )
• Zero
◆◆ Sign : 0 hoặc 1 , tương ứng 0 + và 0-
◆◆ Exponent : luôn luôn [ 00 .. 0 ] m
◆◆
Fraction : luôn luôn [ 00 .. 0 ] n
• Infinity
◆◆ Sign : 0 hoặc 1 , tương ứng + ∞ và -∞
◆◆ Exponent : luôn luôn [ 11 .. 1 ] m
◆◆
Fraction : luôn luôn [ 00 .. 0 ] n
• NaN ( not a number )
◆◆ Sign : 0 hoặc 1
◆◆ Exponent : luôn luôn [ 11 .. 1 ] m
◆◆
Fraction : bất kì số nào , ngoại trừ [ 00 .. 0 ] n
Chúng ta đã thấy tiêu chuẩn IEEE 754 đã mã hoá một số thực bằng hệ nhị phân như thế nào . Dưới đây là một số kiểu dữ liệu floating point đã được định nghĩa trước và các thông số của chúng :
Một số kiểu floating point thông dụng được định nghĩa trong IEEE 754
(*): tối đa bao nhiêu số chữ số thập phân sau dấu phẩy có thể được biểu thị , hay nói cách khác là độ chính xác . Với n fraction bits , ta có được tối đa số chữ số thập phân được xác định bằng công thức : decimaldigits = log 10
2 n + 1 . Lấy ví dụ như chúng ta có số bit fraction n = 1 , như vậy phần thập phân chúng ta có thể có tối đa là 1 chữ số . Nếu có 9 bit fraction , ta có độ chính xác đến 3 chữ số thập phân . Như vậy , càng nhiều
PHÉP LÀM TRÒN Bởi vì kiểu dữ liệu floating point có hữu hạn số bit phần thập phân , nếu số thực có số chữ số thập phân lớn hơn số bit cho phép , những phần thập phân mà floating point không biểu thị được sẽ được bỏ đi , và số thực sẽ được làm tròn .
IEEE 754 quy định có 4 chế độ làm tròn khác nhau :
Round to nearest : chế độ mặc định , kết quả được làm tròn tới số floating point gần nhất . Nếu nằm giữa 2 số floating point thì sẽ chọn số có bit thấp nhất là 0 .
Round toward 0 : kết quả được làm tròn tới số floating point gần nhất và gần giá trị 0
Round toward + ∞ : hay còn gọi là ceiling , kết quả được làm tròn tới số floating point gần nhất và lớn hơn số thực
Round toward -∞ : hay còn gọi lại floor , kết quả được làm tròn tới số floating point gần nhất và nhỏ hơn số thực
Một số ví dụ cho thấy cách hoạt động của các chế độ làm tròn ( giả sử ta làm tròn đến phần nguyên ):
Các kiểu làm tròn số float được quy định bởi IEEE 754
SAI SỐ DO PHÉP LÀM TRÒN
Như ta thấy , floating point không biểu thị chính xác một số thực , mà nó chỉ có thể xấp xỉ thông qua phép làm tròn . Tương tự như các kiểu dữ liệu khác , ta cũng có các phép toán cơ bản trên số float , ví dụ : cộng , trừ , nhân , chia , so sánh ... và , không loại trừ , kết quả của các phép toán này cũng sẽ được làm tròn như vậy . Vì vậy , khi ta thay đổi thứ tự thực hiện các phép toán hoặc thay bằng phép toán tương đương nhau , kết quả mỗi trường hợp sẽ khác nhau .
Một ví dụ về việc thay đổi thứ tự thực hiện phép toán : int main ( int agrc , char ** arg ) { float a = 0.2f ; float b = 0.3f ; float c = 0.4f ; float sum _ 1 = ( a + b ) + c ; float sum _ 2 = a + ( b + c ); printf (“ Sum _ 1 is % 0.10f \\ Sum _ 2 is % 0.10f \ n ”, sum _ 1 , sum _ 2 );
} return 0 ;
26 DIJSKTRA