Có rất nhiều cách để lưu trữ số phân số, và mỗi cách đều có ưu điểm và nhược điểm.
Điểm nổi là, cho đến nay, là định dạng phổ biến nhất. Nó hoạt động bằng cách mã hóa một dấu hiệu, một lớp phủ và số mũ cơ sở 2 đã ký thành các số nguyên và đóng gói chúng thành một bó bit. Ví dụ: bạn có thể có mantissa 32 bit 0.5
(được mã hóa dưới dạng 0x88888888
) và số mũ có chữ ký 32 bit của +3
( 0x00000003
), sẽ giải mã thành 4.0
(0.5 * 2 ^ 3
). Các số dấu phẩy động rất nhanh, vì chúng được triển khai trong phần cứng và các thang đo chính xác của chúng với kích thước tuyệt đối, nghĩa là, số càng nhỏ thì độ chính xác tuyệt đối của bạn càng tốt, do đó sai số làm tròn tương đối không đổi với kích thước tuyệt đối. Phao là tuyệt vời cho các giá trị được lấy mẫu từ một miền liên tục, chẳng hạn như độ dài, mức áp suất âm thanh, mức độ ánh sáng, v.v. và do đó, chúng thường được sử dụng trong xử lý âm thanh và hình ảnh, cũng như phân tích thống kê và mô phỏng vật lý. Nhược điểm lớn nhất của chúng là chúng không chính xác, nghĩa là chúng dễ bị lỗi làm tròn và chúng không thể biểu diễn chính xác tất cả các phân số thập phân. Tất cả các ngôn ngữ lập trình chính thống có một điểm nổi của một số loại.
Điểm cố địnhhoạt động bằng cách sử dụng các số nguyên đủ lớn và hoàn toàn dự trữ một phần bit của chúng cho phần phân số. Ví dụ, số điểm cố định 24,8 bit dự trữ 24 bit cho phần nguyên (bao gồm cả dấu) và 8 bit cho phần phân số. Dịch chuyển sang phải số đó 8 bit cho chúng ta phần nguyên. Các số điểm cố định được sử dụng phổ biến khi các đơn vị dấu phẩy động phần cứng không phổ biến hoặc ít nhất là chậm hơn nhiều so với các số nguyên của chúng. Mặc dù các số điểm cố định có phần dễ xử lý hơn về mặt chính xác (nếu chỉ vì chúng dễ lý do hơn), chúng kém hơn nhiều so với các số khác - chúng có độ chính xác thấp hơn, phạm vi nhỏ hơn và vì thêm các phép toán là cần thiết để sửa các phép tính cho sự dịch chuyển ngầm định, toán học điểm cố định ngày nay thường chậm hơn toán học dấu phẩy động.
Các loại số thập phân hoạt động giống như số float hoặc số điểm cố định, nhưng chúng giả sử một hệ thập phân, nghĩa là số mũ của chúng (ẩn hoặc rõ ràng) mã hóa lũy thừa 10, không phải lũy thừa 2. Ví dụ, một số thập phân có thể mã hóa một 23456
số mũ và số mũ của -2
, và điều này sẽ mở rộng thành234.56
. Số thập phân, vì số học không được kết nối cứng vào CPU, chậm hơn số float, nhưng chúng lý tưởng cho mọi thứ liên quan đến số thập phân và cần chính xác các số đó, với việc làm tròn xảy ra ở các điểm được xác định rõ - tính toán tài chính, bảng điểm, v.v ... Một số ngôn ngữ lập trình có các loại thập phân được tích hợp trong đó (ví dụ C #), một số ngôn ngữ khác yêu cầu các thư viện để thực hiện chúng. Lưu ý rằng mặc dù số thập phân có thể biểu thị chính xác các phân số thập phân không lặp lại, độ chính xác của chúng không tốt hơn số thập phân; chọn số thập phân chỉ có nghĩa là bạn có được các biểu diễn chính xác của các số có thể được biểu diễn chính xác trong một hệ thập phân (giống như số float có thể biểu diễn chính xác các phân số nhị phân).
Các số hợp lý lưu trữ một tử số và một bộ khử, thường sử dụng một số loại số nguyên bignum (một loại số có thể phát triển lớn như các ràng buộc bộ nhớ của máy tính cho phép). Đây là loại dữ liệu duy nhất trong nhóm có thể mô hình chính xác các số như 1/3
hoặc 3/17
, cũng như các thao tác trên chúng - các số liệu hợp lý, không giống như các loại dữ liệu khác, sẽ tạo ra kết quả chính xác cho những thứ như3 * 1/3
. Toán học khá đơn giản, mặc dù việc đưa ra một thuật toán bao thanh toán hiệu quả là khá khó khăn. Một số ngôn ngữ lập trình có các loại hợp lý được tích hợp vào chúng (ví dụ Common Lisp). Nhược điểm của các lý do bao gồm chúng chậm (nhiều thao tác yêu cầu giảm phân số và bao thanh toán các thành phần của chúng) và nhiều thao tác phổ biến là khó hoặc không thể thực hiện được, và hầu hết các triển khai sẽ làm giảm tỷ lệ hợp lý xuống mức nổi khi điều này xảy ra (ví dụ: khi bạn gọi sin()
trên một lý trí).
BCD (Binary Coded Decimal) sử dụng "nibble" (nhóm 4 bit) để mã hóa các chữ số riêng lẻ; vì một nibble có thể chứa 16 giá trị khác nhau, nhưng các số thập phân chỉ cần 10, có 6 giá trị "bất hợp pháp" trên mỗi nibble. Giống như số thập phân, số BCD là số thập phân chính xác, nghĩa là các phép tính được thực hiện trên số thập phân hoạt động giống như khi bạn sử dụng bút và giấy. Các quy tắc số học cho BCD có phần vụng về, nhưng nhược điểm là việc chuyển đổi chúng thành chuỗi dễ dàng hơn so với một số định dạng khác, đặc biệt thú vị đối với môi trường tài nguyên thấp như hệ thống nhúng.
Các chuỗi , vâng, các chuỗi cũ đơn giản, cũng có thể được sử dụng để biểu diễn các số phân số. Về mặt kỹ thuật, điều này rất giống với BCD, chỉ có một dấu thập phân rõ ràng và bạn sử dụng một byte đầy đủ cho mỗi chữ số thập phân. Như vậy, định dạng là lãng phí (chỉ có 11 trong số 256 giá trị có thể được sử dụng), nhưng nó dễ phân tích và tạo hơn so với BCD. Ngoài ra, bởi vì tất cả các giá trị được sử dụng là "không đáng tin cậy", các số được mã hóa chuỗi trung tính, vô hại và nền tảng có thể đi qua các mạng mà không gặp sự cố. Rất hiếm khi tìm thấy số học được thực hiện trực tiếp trên các chuỗi, nhưng có thể, và khi bạn làm điều đó, chúng chỉ chính xác thập phân như các định dạng thập phân khác (số thập phân và BCD).