Định dạng dấu phẩy động độ chính xác đơn

Định dạng dấu phẩy động độ chính xác đơn (đôi khi còn gọi là FP32 hoặc float32) là một định dạng số máy tính, thường chiếm 32 bit trong bộ nhớ máy tính; nó có khả năng biểu diễn một dải động rộng các giá trị số bằng cách sử dụng dấu phẩy cơ số động.
Một biến số thực dấu phẩy động có khả năng biểu diễn một khoảng giá trị lớn hơn so với một biến dấu phẩy tĩnh có cùng kích thước bit at the cost of precision. Một biến số nguyên có dấu với kích thước 32 bit có thể nhận giá trị tối đa là 231 − 1 = 2.147.483.647, trong khi một biến dấu phẩy động cơ số 2 theo chuẩn IEEE 754 với kích thước 32 bit có thể nhận giá trị tối đa lên tới (2 − 2−23) × 2127 ≈ 3,4028235 × 1038. Tất cả các số nguyên có từ 7 chữ số thập phân trở xuống, và bất cứ giá trị 2"n" nào với điều kiện −149 ≤ "n" ≤ 127, đều có thể được chuyển đổi chính xác thành giá trị dấu phẩy động chính xác đơn theo chuẩn IEEE 754.
Theo tiêu chuẩn IEEE 754-2008, định dạng 32-bit cơ số 2 có tên chính thức là binary32; nó từng có tên gọi single trong chuẩn IEEE 754-1985. Ngoài ra IEEE 754 còn quy định về các kiểu số thực dấu phẩy động khác, như định dạng "chính xác kép" 64-bit cơ số 2, và gần đây hơn là các dạng biểu diễn bằng hệ 10.
Một trong những ngôn ngữ lập trình đầu tiên cung cấp các kiểu dữ liệu dấu phẩy động độ chính xác đơn và kép là Fortran. Trước khi IEEE 754-1985 được chấp thuận rộng rãi, cách biểu diễn và các thuộc tính của các kiểu dữ liệu dấu phẩy động đều phụ thuộc vào từng nhà sản xuất máy tính, từng mẫu máy tính và quyết định của các nhà thiết kế ngôn ngữ lập trình. Ví dụ, trong GW-BASIC, kiểu dữ liệu chính xác đơn được sử dụng là định dạng dấu phẩy động MBF 32-bit.
Định dạng chính xác đơn được gọi là "REAL" trong Fortran, "SINGLE-FLOAT" in Common Lisp, "float" trong C, C++, C#, Java, "Float" trong Haskell và Swift, và "Single" trong Object Pascal (Delphi), Visual Basic, và MATLAB. Tuy nhiên, các kiểu "float" trong Python, Ruby, PHP và OCaml cùng với "single" trong các phiên bản Octave trước 3.2 lại chỉ các số độ chính xác kép. Hầu hết các bản triển khai PostScript và một số hệ thống nhúng chỉ hỗ trợ định dạng chính xác đơn.
Tiêu chuẩn IEEE 754: binary32.
Tiêu chuẩn IEEE 754 quy định một giá trị "binary32" bao gồm:
Định dạng này cho độ chính xác từ 6 đến 9 chữ số thập phân có nghĩa. Nếu một xâu thập phân có từ dưới 6 chữ số có nghĩa được chuyển đổi sang dạng biểu diễn chính xác đơn IEEE 754, sau đó được chuyển đổi lại thành một xâu thập phân có cùng số chữ số như ban đầu, kết quả sẽ giống hệt như xâu gốc.
Bit dấu quyết định dấu của giá trị số và cả dấu của phần định trị. Phần mũ là một giá trị nguyên 8 bit không dấu từ 0 đến 255, được lưu dưới dạng có độ lệch (""): nếu phần mũ được lưu có giá trị là 127 thì giá trị thực sự phải là 0. Giá trị thực của phần mũ chỉ nằm trong khoảng từ −126 tới +127 bởi các giá trị mũ −127 (toàn 0) và +128 (toàn 1) được dành cho các số đặc biệt.
Phần định trị thực bao gồm 23 bit biểu diễn phần lẻ nằm ở phía bên phải dấu phẩy nhị phân cộng thêm một "bit hiểu ngầm" (nằm bên trái dấu phẩy nhị phân) có giá trị 1, trừ khi tất cả bit ở phần mũ đều là 0. Do đó chỉ có 23 bit phần lẻ của định trị xuất hiện trong định dạng bộ nhớ, còn tổng độ chính xác phải là 24 bit (tương đương với log10(224) ≈ 7,225 chữ số thập phân). Các bit được sắp xếp như sau:
Giá trị thực của một dữ liệu "binary32" 32 bit, có "dấu", phần mũ lệch "e" (dạng số nguyên không dấu 8 bit) và "phần lẻ 23 bit" cho trước có thể được tính như sau
tương đương với
Trong ví dụ này:
do đó:
Lưu ý:
Mã hóa phần mũ.
Phần mũ trong định dạng dấu phẩy động nhị phân độ chính xác đơn được mã hóa bằng cách biểu diễn offset-binary, với giá trị zero offset là 127; hay còn gọi là độ lệch mũ ("exponent bias") trong chuẩn IEEE 754.
Do đó, để lấy được giá trị thực của phần mũ thông qua cách biểu diễn offset-binary, cần phải trừ giá trị offset 127 khỏi phần mũ được lưu.
Các trường hợp phần mũ lưu với giá trị 00H và FFH là các trường hợp đặc biệt.
Giá trị chuẩn hóa dương nhỏ nhất là formula_13 và giá trị dương nhỏ nhất (dưới mức chuẩn hóa) là formula_14.