Số Thực Dấu Phẩy Động
Trong tin học, dấu phẩy động được dùng để chỉ một hệ thống biểu diễn số mà trong đó sử dụng một chuỗi chữ số (hay bit) để biểu diễn một số hữu tỉ. Thuật ngữ dấu phẩy động xuất phát từ chỗ hệ thống dấu phẩy động có dấu phẩy cơ số (tức là dấu phẩy thập ...
Trong tin học, dấu phẩy động được dùng để chỉ một hệ thống biểu diễn số mà trong đó sử dụng một chuỗi chữ số (hay bit) để biểu diễn một số hữu tỉ.
Thuật ngữ dấu phẩy động xuất phát từ chỗ hệ thống dấu phẩy động có dấu phẩy cơ số (tức là dấu phẩy thập phân trong trường hợp dùng hệ thập phân thường ngày hoặc là dấu phẩy nhị phân trong trường hợp dùng bên trong máy tính) không cố định mà có thể thay đổi vị trí của nó bất kỳ đâu trong các chữ số có nghĩa của số cần được biểu diễn. Vị trí này được mô tả một cách độc lập trong biểu diễn cụ thể của từng số. Đã có nhiều hệ thống dấu phẩy động khác nhau được dùng trong máy tính; tuy nhiên, vào khoảng hai mươi năm trở lại đây thì hầu hết các máy tính đều dùng cách biểu diễn tuân thủ theo chuẩn IEEE 754.
Một điều cần lưu ý là có sự khác biệt khi gọi tên dấu phẩy cơ số: ở Việt Nam, chúng ta dùng dấu phẩy để ngăn cách giữa phần nguyên và phần thập phân; trong khi các nước như Mỹ, Anh,…dùng dấu chấm để làm điều này. Chính vì thế, thuật ngữ tương ứng với dấu phẩy động ở tiếng Anh là floating point mà dịch sát ra tiếng Việt phải là dấu chấm động. Các phần sau, ta vẫn dùng thuật ngữ dấu phẩy động nhưng khi biểu diễn các số trong ví dụ thì vẫn mô tả theo quy ước của các nước nói trên (mà cũng là quy ước chuẩn dùng trong máy tính), nghĩa là vẫn dùng dấu chấm thay cho dấu phẩy.
Ưu điểm của cách biểu diễn dấu phẩy động là nó cho phép biểu diễn một tầm giá trị rộng hơn nhiều so với cách biểu diễn dấu phẩy tĩnh. Lấy ví dụ, nếu cách biểu diễn dấu phẩy tĩnh có bảy chữ số thập phân với quy ước dấu phẩy thập phân luôn nằm cố định ở chữ số thứ năm, thì cách biểu diễn dấu phẩy tĩnh có thể mô tả các số như 12345.67, 8765.43, 123.00 (tức 00123.00) và vân vân. Trong khi đó cách biểu diễn dấu phẩy động (chẳng hạn như định dạng thập phân32 của IEEE 754) với bảy chữ số thập phân ngoài việc mô tả được các số nói trên còn mô tả được nhiều số khác mà dấu phẩy tĩnh không mô tả được như 1.234567, 123456.7, 0.00001234567, 1234567000000000, và nhiều nữa. Tất nhiên, định dạng theo kiểu dấu phẩy động cần thêm bộ nhớ hơn so với dấu phẩy tĩnh (vì cần có thêm bộ nhớ để mô tả vị trí của dấu phẩy cơ số), nhưng ta có thể nói: với cùng một không gian bộ nhớ, cách biểu diễn dấu phẩy động đạt được tầm mô tả rộng hơn.
Tốc độ các phép toán làm việc với số dấu phẩy động là một thước đo quan trọng nhằm đánh giá khả năng của một máy tính trong nhiều ứng dụng khác nhau. Đơn vị đo về tốc độ này là FLOPS.
Một cách biểu diễn số (gọi là hệ thống ký số trong toán học) bao gồm phương pháp dùng để lưu trữ một con số bằng một chuỗi các chữ số. Số học được định nghĩa là tập hợp các thao tác cần làm trên cách biểu diễn số đã cho để thực hiện các phép toán số học (cộng, trừ, nhân, chia…).
Có một số cách dùng chuỗi các chữ số để biểu diễn các con số. Theo ký hiệu toán học thông dụng, chuỗi chữ số có thể có chiều dài tùy ý, và vị trí của dấu phẩy cơ số được chỉ ra bằng cách đặt một ký tự rõ ràng (đó là dấu chấm đối với các nước Anh, Mỹ… hoặc là dấu phẩy đối với Việt Nam). Trong trường hợp chuỗi chữ số không có dấu phẩy thì nó được xem như đặt ở phía cuối bên phải của chuỗi chữ số (tức là, số đang biểu diễn là một số nguyên). Trong trường hợp máy tính thì với chỉ hai bit 0 và 1, không thể có một ký tự rõ ràng phân biệt để mô tả dấu phẩy. Trong hệ thống dấu phẩy tĩnh, người ta quy ước vị trí cố định của dấu phẩy cơ số trong chuỗi chữ số. Lấy ví dụ, quy ước rằng chuỗi chữ số gồm 8 chữ số thập phân và dấu phẩy thập phân luôn nằm ở ngay giữa chuỗi thì khi đọc giá trị "00012345" ta phải ngầm hiểu đây là số có giá trị 1.2345.
Trong ký hiệu khoa học, một con số thường được lấy tỉ lệ (tức được nhân) với một lũy thừa của 10 sao cho kết quả sau khi lấy tỉ lệ nằm trong một tầm cho trước – điển hình là nằm trong khoảng 1 và 10, tức là kết quả sẽ được viết ra với dấu phẩy cơ số nằm trực tiếp sau chữ số đầu tiên. Để người đọc có thể biết giá trị thực của con số, lũy thừa của 10 sẽ được viết riêng ra ở cuối kết quả. Lấy ví dụ, chu kỳ xoay mặt trăng Io của hành tinh Jupiter là 152853.5047 giây. Khi đó, con số này được biểu diễn dưới dạng ký hiệu khoa học chuẩn là 1.528535047×105 giây.
Cách biểu diễn số dấu phẩy động tương tự với cách dùng trong ký hiệu khoa học. Mô tả luận lý thì một số dấu phẩy động bao gồm:
- Một chuỗi chữ số có dấu với chiều dài cho trước và có cơ số cho trước. Chuỗi này được gọi là phần định trị. Dấu phẩy cơ số không được thể hiện tường minh ở phần này, nhưng được quy ước ngầm là luôn luôn nằm tại một vị trí cụ thể trong phần định trị - mà thường là ngay sau hoặc ngay trước chữ số có nghĩa lớn nhất. Bài viết này nếu không nói rõ sẽ tuân theo quy ước là dấu phẩy cơ số luôn ở ngay sau chữ số có nghĩa lớn nhất (tức là chữ số đầu tiên tính từ bên trái qua). Độ dài của phần định trị xác định độ chính xác mà các con số có thể được biểu diễn.
- Một số mũ là số nguyên có dấu, nhằm mô tả phần lấy tỉ lệ tức cho phép người đọc xác định được giá trị thực của số từ phần định trị.
Thử lấy một ví dụ ở cơ số 10 (hệ thập phân mà ta thường dùng hằng ngày) với số 152853.5047 mà có độ chính xác là mười chữ số thập phân. Khi biểu diễn dưới dạng dấu phẩy động thì nó sẽ được viết với phần định trị là 1528535047 (với quy ước là vị trí của dấu phẩy cơ số nằm ngay sau chữ số có nghĩa lớn nhất, tức là chữ số 1). Khi đó, phần định trị được hiểu ngầm là 1.528535047. Để người đọc có thể khôi phục lại giá trị ban đầu thì cần phải thêm số mũ là 5. Khi đó, người đọc sẽ nhân giá trị của phần định trị (sau khi đã thêm dấu phẩy cơ số vào vị trí quy ước) với 105 để được 1.528535047 × 105, hay 152853.5047.
Mô tả hình thức thì giá trị cuối cùng của một số dấu phẩy động là

với s là giá trị của phần định trị (sau khi đã đặt dấu phẩy cơ số vào vị trí quy ước), b là cơ số, và e là số mũ.
Hoàn toàn tương đương, có thể viết công thức trên như sau:

với S là giá trị nguyên của toàn bộ phần định trị mà chưa đặt dấu phẩy cơ số và p là độ chính xác – số chữ số của phần định trị.
Khi dùng cách biểu diễn dấu phẩy động, phương pháp lưu trữ phần định trị, số mũ và bit dấu bên trong máy tính tùy thuộc vào mỗi loại máy theo chuẩn nào. Hiện nay, chuẩn IEEE 754 là thông dụng nhất sẽ được mô tả ở phần sau. Nhưng ở đây, chúng ta thử xét định dạng nhị phân độ chính xác đơn (32 bit) của IEEE754. Theo chuẩn này thì một số dấu phẩy động định dạng độ chính xác đơn sẽ có 32 bit bao gồm: 1 bit dấu, 23 bit cho phần định trị và 8 bit cho phần số mũ.Lấy ví dụ, 33 bit đầu tiên của số π là 11.001001 00001111 11011010 10100010 0 (lưu ý dấu phẩy cơ số nằm ở sau bit 1 thứ hai từ bên trái qua). Để biểu diễn số π này ở định dạng IEEE 754 độ chính xác đơn, ta phải làm tròn chuỗi bit nói trên còn 24 bit (tại sao lại là 24 bit trong khi phần định trị của định dạng chính xác đơn chỉ có 23 bit sẽ được giải thích ngay sau đây). Để làm tròn như vậy, ta kết hợp các giá trị của bit thứ 24 và bit thứ 25 để được giá trị 11.001001 00001111 11011011. Yêu cầu của chuẩn IEEE 754 là phần định trị phải có giá trị nằm trong khoảng từ 1 đến 2 (tức là chuẩn IEEE 754 quy ước dấu chấm cơ số luôn luôn nằm ngay sau bit 1 đầu tiên). Chính vì thế ta phải lấy tỉ lệ kết quả làm tròn thành 1.1001001 00001111 11011011với số mũ e = 1. Đến đây, vì bit đầu tiên (và cũng là duy nhất) đứng trước dấu phẩy cơ số của phần định trị luôn luôn là 1 nên ta không cần lưu trữ bit này và viết gọn phần định trị là 1001001 00001111 11011011. Khi đó, số bit của phần định trị chỉ còn 23 bit khớp với số bit được chuẩn IEEE 754 dùng cho phần định trị. Để xác định giá trị của π, ta dùng công thức

với n là bit thứ n của phần định trị. Quá trình lấy tỉ lệ phần định trị sao cho giá trị của nó phải nằm trong khoảng từ 1 đến 2 và bỏ không lưu trữ bit 1 đầu tiên được gọi là chuẩn hóa. Ta có thể xem việc chuẩn hóa giống như một dạng của nén; nó cho phép ta thực hiện lưu trữ 24 bit định trị trong một trường chỉ có 23 bit với lưu ý rằng luôn luôn có một bit 1 ở trước dấu phẩy cơ số.
Một số cách khác dùng để biểu diễn số không nguyên trong máy tính
Biểu diễn dấu phẩy động nói chung, đặc biệt định dạng chuẩn IEEE, hiện nay và trong tương lai gần vẫn là phương pháp cho phép lưu trữ trong máy tính giá trị xấp xỉ các số thực bởi vì nó được sử dụng hiệu quả trong hầu hết các bộ vi xử lý máy tính. Tuy nhiên, vẫn có những phương pháp