Floating Point
Sơ lược về số Floating Point IEEE 754 (Phần 1)
1. Giới thiệu sơ lược về số Floating Point
Trong thế giới tự nhiên, chúng ta thường đùng các số kiểu 55.432 hoặc 65345.43, được gọi là các số hệ 10. Việc sử dụng trên thường gọi là Fixed Point. Về mặt khoa học thì những số trên có thể chấp nhận ở một mức tạm được, nhưng các nhà khoa học trên thế giới đều sử dụng một "format" để viết một số là Floating Point.
Floating Point được quy định sau đây:
- Về phần nguyên (tức số đứng trước dấu phẩy về bên trái): chỉ là số có 1 chữ số và không có chữ số 0 nào đứng trước chữ số đó. Ví dụ: 1234.54 sẽ được viết lại là 1.23454 x 10^3 (vì chúng ta dùng hệ 10 nên sẽ nhân với 10, như 100 là 1 x 10^2), 0001023.324 sẽ được viết là 1.0234324 x 10^3.
- Về phần thập phân (tức số đứng sau dấu phẩy về bên phải): muốn viết bao nhiêu số cũng được. Lưu ý nếu muốn dịch dấu phẩy về bên trái thì sẽ tăng số mũ của số 10, ngược lại thì sẽ giảm số mũ của số 10.
Đối với máy tính cũng như vậy. Các nhà thiết kế máy tính trên thế giới đều sử dụng 2 loại số để thiết kế nên hệ thống của mình: Fixed Point và Floating Point (tương ứng với trong ngộn ngữ C/C++ là int, long với float, double). Việc sử dụng số Fixed Point "có vẻ" thích hợp với các mạch logic khi chúng dễ thiết kế. Nhưng trong một số trường hợp, việc tính toán bằng số Fixed Point sẽ phát huy tác dụng.
2. Định nghĩa
Có 1 vài định nghĩ trước đinh nghĩa các bạn cần quan tâm trước khi đọc phần Format:
- biased exponent (số mũ đã được cộng với bias).
- binary floating-point number (số floating-point dùng trong hệ nhị phân).
- denormalized number ("số chưa chuẩn hóa", có thể hiểu sơ sơ là số có phần nguyên không phải có 1 chữ số).
- exponent (phần mũ, là 1 phần trong format của số Floating Point IEEE 754).
- fraction (phần thập phân, là 1 phần trong format của số Floating Point IEEE 754).,
- significant (số sau khi đã thêm số 1 hoặc số 0 trước các số fraction, ví dụ số norrmalized là 1.fraction còn denormalized là 0.fraction)
- NaN (Not a Number, không phải là số. Có 2 loại số NaN là signaling NaN và quiet NaN),
3. Format
Có 2 loại số theo chuẩn IEEE Floating Point IEEE754: 32 bit (single precision) và 64 bit (double precision) (thực ra các bạn có thể thiết kế khác với chuẩn trên). Với mỗi loại sẽ có 1 công thức chung để tính toán từ số IEEE 754 ra số thập phân:
Với s = 0 hoặc 1
E = bất kỳ giá trị nào nằm trong khoảng Emin và Emax (Bảng 1)
bi = 0 hoặc 1 (nếu đó là số normalize thì b(0) là 1, ngược lại là 0)
p là số bit fraction
Tổng quát, 2 loại 32bit và 64bit đều có 3 trường khác nhau đó là
- 1bit dấu s
- 8bit hoặc 11bit Biased exponent e = E + exponent bias
- 23bit hoặc 52bit Fraction f = b(1)b(2)...b(p-1)
3.1. Single Precision Floating Point (32 bit):
Nếu e = 255 (11111111) và f khác 0 thì số đó là số NaN. v = NaN
Nếu e = 255 và f = 0 thì số đó là infinity với dấu phụ thuộc vào bit s. v = (-1)^s.(infinity)
Nếu 0<e<255, thì số đó là normalized. v = (-1)^s.2^(e - 127).(1.f).
Nếu e = 0 và f khác 0 thì số đó là denormalized. v = (-1)^s.2^(-126).(0.f).
Nếu e = 0 và f = 0, thì số đó là số 0 với dấu phụ thuộc vào bit s. v = (-1)^s.0
3.2. Double Precision Floating Point (64 bit):
Nếu e = 2047(11111111111) và f khác 0 thì số đó là số NaN. v = NaN
Nếu e = 2047 và f = 0 thì số đó là infinity với dấu phụ thuộc vào bit s. v = (-1)^s.(infinity)
Nếu 0<e<2047, thì số đó là normalized. v = (-1)^s.2^(e - 1023).(1.f).
Nếu e = 0 và f khác 0 thì số đó là denormalized. v = (-1)^s.2^(-1022).(0.f).
Nếu e = 0 và f = 0, thì số đó là số 0 với dấu phụ thuộc vào bit s. v = (-1)^s.0
Rounding takes a number regarded as infinitely precise and, if necessary, modifies it to fit in the
destination’s format while signaling the inexact exception, underflow, or overflow when appropriate .
Except where stated otherwise, every operation shall be performed as if it first produced an intermediate
result correct to infinite precision and with unbounded range, and then rounded that result according to one
of the attributes in this clause
The rounding-direction attribute affects all computational operations that might be inexact. Inexact numeric
floating-point results always have the same sign as the unrounded result.
The rounding-direction attribute affects the signs of exact zero sums (see 6.3), and also affects the
thresholds beyond which overflow (see 7.4) and underflow (see 7.5) are signaled.
NaNs are not rounded (but see 6.2.3)
e value NaN (Not a Number) is used to represent a value that does not represent a real number. NaN's are represented by a bit pattern with an exponent of all 1s and a non-zero fraction. There are two categories of NaN: QNaN (Quiet NaN) and SNaN (Signalling NaN). A QNaN is a NaN with the most significant fraction bit set. QNaN's propagate freely through most arithmetic operations. These values are generated from an operation when the result is not mathematically defined. An SNaN is a NaN with the most significant fraction bit clear. It is used to signal an exception when used in operations. SNaN's can be handy to assign to uninitialized variables to trap premature usage. Semantically, QNaN's denote indeterminate operations, while SNaN's denote invalid operations.
Nhận xét
Đăng nhận xét