Trong tin học, dấu phẩy động là một phương pháp biểu diễn số, sử dụng chuỗi ký tự (hoặc bit) để thể hiện số hữu tỉ.
Thuật ngữ dấu phẩy động xuất phát từ việc hệ thống này có dấu phẩy cơ số (dấu phẩy thập phân trong hệ thập phân thường ngày hoặc dấu phẩy nhị phân trong máy tính) không cố định và có thể di chuyển trong các chữ số có ý nghĩa của số được biểu diễn. Vị trí này được xác định độc lập trong cách biểu diễn số. Có nhiều hệ thống dấu phẩy động khác nhau, nhưng phần lớn các máy tính hiện nay sử dụng chuẩn IEEE 754.
Lưu ý rằng có sự khác biệt trong cách gọi tên dấu phẩy cơ số: ở Việt Nam, dấu phẩy được dùng để phân tách phần nguyên và phần thập phân, trong khi các nước như Mỹ và Anh dùng dấu chấm. Do đó, thuật ngữ tương ứng với dấu phẩy động trong tiếng Anh là floating point, và dịch sát nghĩa ra tiếng Việt là dấu chấm động. Tuy nhiên, trong các ví dụ, chúng ta vẫn dùng thuật ngữ dấu phẩy động theo quy ước của chuẩn máy tính, tức là dùng dấu chấm thay vì dấu phẩy.
Ưu điểm của dấu phẩy động là khả năng biểu diễn giá trị rộng hơn so với dấu phẩy tĩnh. Ví dụ, nếu dấu phẩy tĩnh có bảy chữ số thập phân với dấu phẩy luôn ở chữ số thứ năm, nó có thể mô tả các số như 12345.67, 8765.43, 123.00, v.v. Trong khi đó, dấu phẩy động (như định dạng decimal32 của IEEE 754) với bảy chữ số thập phân có thể mô tả nhiều số hơn như 1.234567, 123456.7, 0.00001234567, 1234567000000000, và nhiều số khác. Mặc dù định dạng dấu phẩy động yêu cầu nhiều bộ nhớ hơn để lưu trữ vị trí dấu phẩy cơ số, nhưng nó cho phép mô tả một dải giá trị rộng hơn trong cùng một không gian bộ nhớ.
Tốc độ thực hiện các phép toán với số dấu phẩy động là chỉ số quan trọng để đánh giá hiệu suất của máy tính trong nhiều ứng dụng khác nhau. Đơn vị đo lường cho tốc độ này là FLOPS.
Tổng quan
Biểu diễn số (hay còn gọi là hệ thống ký số trong toán học) là phương pháp lưu trữ một con số dưới dạng chuỗi các chữ số. Số học được định nghĩa là tập hợp các thao tác trên biểu diễn số đã cho để thực hiện các phép toán số học (như cộng, trừ, nhân, chia…).
Có nhiều cách để dùng chuỗi chữ số biểu diễn các con số. Theo ký hiệu toán học phổ biến, chuỗi chữ số có thể có độ dài tùy ý, và vị trí của dấu phẩy cơ số được xác định bằng một ký tự rõ ràng (như dấu chấm ở Anh, Mỹ hoặc dấu phẩy ở Việt Nam). Nếu chuỗi chữ số không có dấu phẩy, thì nó được coi là nằm ở cuối bên phải của chuỗi (nghĩa là số đang biểu diễn là số nguyên). Trong máy tính, với chỉ hai bit 0 và 1, không có ký tự rõ ràng để biểu thị dấu phẩy. Trong hệ thống dấu phẩy tĩnh, người ta quy định vị trí cố định của dấu phẩy cơ số trong chuỗi chữ số. Ví dụ, nếu chuỗi số có 8 chữ số thập phân và dấu phẩy thập phân luôn nằm ở giữa chuỗi, thì khi đọc '00012345' ta hiểu đây là số 1.2345.
Trong ký hiệu khoa học, một số thường được nhân với một lũy thừa của 10 sao cho kết quả nằm trong khoảng được quy định – thường là từ 1 đến 10, tức là dấu phẩy cơ số nằm ngay sau chữ số đầu tiên. Để người đọc hiểu giá trị thực của số, lũy thừa của 10 được ghi riêng ở cuối kết quả. Ví dụ, chu kỳ xoay của mặt trăng Io quanh hành tinh Mộc Tinh là 15285047 giây. Trong ký hiệu khoa học chuẩn, số này được viết là 1.528535047×10 giây.
Cách biểu diễn số dấu phẩy động tương tự như trong ký hiệu khoa học. Về mặt lý thuyết, 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 và cơ số được chỉ định trước. Chuỗi này gọi là phần định trị. Dấu phẩy cơ số không được thể hiện rõ trong phần này, nhưng được quy định ngầm là nằm tại một vị trí cụ thể - thường là ngay sau hoặc trước chữ số có giá trị lớn nhất. Trong bài viết này, nếu không có chỉ định khác, sẽ mặc định rằng dấu phẩy cơ số nằm ngay sau chữ số có giá trị lớn nhất (tức là chữ số đầu tiên từ bên trái). Độ dài của phần định trị xác định độ chính xác của số được biểu diễn.
- Một số mũ là số nguyên có dấu, dùng để mô tả phần tỉ lệ, giúp người đọc xác định giá trị thực của số từ phần định trị.
Ví dụ với hệ thập phân (cơ số 10) sử dụng số 15285047 với độ chính xác là mười chữ số thập phân. Khi biểu diễn dưới dạng số dấu phẩy động, số này sẽ có phần định trị là 1528535047 (với quy ước rằng dấu phẩy cơ số nằm ngay sau chữ số có giá trị lớn nhất, tức là chữ số 1). Phần định trị ngầm hiểu là 1.528535047. Để khôi phục giá trị gốc, cần thêm số mũ là 5. Khi đó, người đọc sẽ nhân phần định trị (sau khi đã thêm dấu phẩy cơ số vào vị trí quy ước) với 10 để có 1.528535047 × 10, hay 15285047.
Về mặt hình thức, giá trị cuối cùng của một số dấu phẩy động được biểu diễn 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 định), b là cơ số, và e là số mũ.
Hoàn toàn tương đương, công thức trên có thể được viết lại như sau:
với S là giá trị nguyên của toàn bộ phần định trị trước khi đặt dấu phẩy cơ số và p là độ chính xác – số chữ số trong phần định trị.
Khi sử dụng biểu diễn số dấu phẩy động, cách lưu trữ phần định trị, số mũ và bit dấu trong máy tính phụ thuộc vào chuẩn của máy. Hiện nay, chuẩn IEEE 754 là phổ biến nhất và sẽ được trình bày sau. Tuy nhiên, để minh họa, chúng ta sẽ xem xét định dạng nhị phân độ chính xác đơn (32 bit) theo IEEE 754. Theo chuẩn này, số dấu phẩy động định dạng độ chính xác đơn 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ũ. Ví dụ, 33 bit đầu tiên của số π là 11.001001 00001111 11011010 10100010 0 (dấu phẩy cơ số nằm sau bit thứ hai từ bên trái). Để biểu diễn số π ở định dạng IEEE 754 độ chính xác đơn, ta cần làm tròn chuỗi bit này thành 24 bit (sẽ giải thích tại sao lại là 24 bit). Để làm tròn, ta kết hợp các giá trị của bit thứ 24 và bit thứ 25 để có 11.001001 00001111 11011011. Chuẩn IEEE 754 yêu cầu phần định trị nằm trong khoảng từ 1 đến 2 (dấu chấm cơ số luôn ngay sau bit 1 đầu tiên). Do đó, ta phải tỷ lệ kết quả làm tròn thành 1.1001001 00001111 11011011 với số mũ e = 1. Vì bit đầu tiên đứng trước dấu phẩy cơ số 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ị giảm xuống còn 23 bit, khớp với số bit được chuẩn IEEE 754 quy định cho phần định trị. Để xác định giá trị của π, ta dùng công thức
Trong đó, n đại diện cho bit thứ n của phần định trị. Việc chuẩn hóa phần định trị sao cho giá trị nằm trong khoảng từ 1 đến 2, đồng thời bỏ qua bit 1 đầu tiên, được gọi là chuẩn hóa. Quy trình này có thể coi là một hình thức nén, cho phép lưu trữ 24 bit định trị trong một trường chỉ 23 bit nhờ việc luôn có một bit 1 đứng trước dấu phẩy cơ số.
Các phương pháp khác để biểu diễn số không nguyên trong máy tính bao gồm:
Biểu diễn dấu phẩy động, đặc biệt là theo chuẩn IEEE, hiện tại và trong tương lai vẫn là phương pháp chủ yếu để lưu trữ giá trị xấp xỉ các số thực vì sự hiệu quả của nó trong các bộ vi xử lý máy tính. Tuy nhiên, còn một số phương pháp khác như:
- Phương pháp dấu phẩy tĩnh sử dụng phần cứng làm việc với số nguyên và phần mềm quy định vị trí cụ thể của dấu phẩy thập phân hoặc nhị phân, chẳng hạn, sau 6 bit hoặc 6 chữ số từ bên phải. Phần cứng cho phương pháp này đơn giản hơn so với phần cứng cần cho dấu phẩy động và thường dùng cho phép toán số nguyên. Dấu phẩy tĩnh nhị phân thường được dùng trong các bộ vi xử lý nhúng, trong khi dấu phẩy tĩnh thập phân thường được áp dụng trong các ứng dụng thương mại.
- Mã BCD mã hóa số thập phân bằng cách thay mỗi chữ số thập phân bằng một chuỗi số nhị phân tương ứng.
- Đối với những yêu cầu về độ chính xác cao hơn, các phép toán dấu phẩy động có thể được điều chỉnh bằng phần mềm để phần định trị có thể thay đổi chiều dài, tức là có thể tăng hoặc giảm tùy theo yêu cầu phần mềm. Phương pháp này gọi là độ chính xác thay đổi, hay còn gọi là số học 'bignum có tỉ lệ'.
- Các hệ thống số học như Mathematica, Maple và Maxima thường cho phép xử lý các số vô tỉ như hoặc theo kiểu hình thức, tức là xử lý như các ký hiệu toán học thuần túy mà không cần chuyển đổi sang dạng gần đúng dấu phẩy động. Các phần mềm này có khả năng tính toán các biểu thức như '' một cách chính xác, nhờ vào khả năng 'hiểu' ý nghĩa toán học của các ký hiệu này.
- Phương pháp dựa trên logarith tự nhiên đôi khi được sử dụng trong các ứng dụng FPGA, nơi mà các phép toán chủ yếu là nhân và chia. Phương pháp này cung cấp độ chính xác tốt hơn cho các toán hạng nhỏ hơn và có phạm vi biểu diễn rộng hơn, tương tự như dấu phẩy động.
Phạm vi của các số dấu phẩy động
Bằng cách điều chỉnh vị trí của dấu phẩy cơ số, biểu diễn dấu phẩy động cho phép thực hiện phép toán trên một phạm vi rộng với số chữ số cố định, đồng thời duy trì độ chính xác cao. Ví dụ, trong hệ thống dấu phẩy động thập phân với phần định trị ba chữ số và phần mũ một chữ số (tổng cộng là 4 chữ số), phép nhân thường được viết bởi con người
- 0.12 × 0.12 = 0.0144
sẽ được thể hiện dưới dạng dấu phẩy động như sau:
- (1.20×10) × (1.20×10) = (1.44×10).
Nếu phép nhân trên được thực hiện trong hệ thống dấu phẩy tĩnh với tài nguyên hiển thị 4 chữ số và quy ước dấu phẩy thập phân luôn sau chữ số đầu tiên bên trái, kết quả sẽ là
- 0.120 × 0.120 = 0.014.
Rõ ràng, một chữ số của kết quả sẽ bị mất do chỉ có 4 chữ số để hiển thị và dấu phẩy thập phân không thể điều chỉnh, bị quy ước cố định. Phạm vi của số dấu phẩy động phụ thuộc vào số bit hoặc số chữ số của phần định trị và phần số mũ. Trong hệ thống máy tính thông thường, một số dấu phẩy động nhị phân với định dạng ‘độ chính xác kép’ (64 bit) có phần định trị 52 bit (thực ra là 53 bit vì có một bit 1 luôn luôn có nhưng không được hiển thị rõ ràng), phần số mũ 11 bit và 1 bit dấu. Phạm vi dương mà định dạng này có thể biểu diễn là từ 10 đến 10 (vì 308 xấp xỉ 1023 × log10(2) và phạm vi số mũ của định dạng độ chính xác kép là [−1023,1024]). Tổng phạm vi hiển thị của định dạng độ chính xác kép là khoảng từ −10 đến +10 (xem IEEE754).
Một hệ thống số dấu phẩy động F(b, p, l, u) (với b là cơ số, p là độ chính xác của hệ thống – tức số chữ số trong phần định trị bao gồm cả bit không hiển thị nhưng ngầm hiểu, l và u lần lượt là số mũ nhỏ nhất và lớn nhất hệ thống có thể biểu diễn) có thể biểu diễn số lượng các con số chuẩn hóa theo công thức sau:
Số dương nhỏ nhất trong các số dấu phẩy động chuẩn hóa, được gọi là mức tràn dưới (underflow level), có giá trị bằng UFL = b^l. UFL có một bit 1 (không hiển thị rõ ràng mà được hiểu ngầm) trước dấu chấm cơ số của phần định trị, các bit còn lại trong phần định trị đều bằng 0, và phần mũ có giá trị nhỏ nhất.
Số dương lớn nhất trong các số dấu phẩy động chuẩn hóa, được gọi là mức tràn trên (overflow level), có giá trị bằng OFL = b^(u+1) * (1-b^(-p)). OFL có tất cả các chữ số trong phần định trị đều bằng (b-1), và phần mũ có giá trị lớn nhất.
Ngoài ra, hệ thống dấu phẩy động cũng có thể biểu diễn các giá trị nằm giữa –UFL và UFL. Những giá trị này bao gồm zero, zero âm, và các số không chuẩn hóa.
Lịch sử
Năm 1938, nhà phát minh Konrad Zuse ở Berlin đã chế tạo 'Z1', máy tính cơ lập trình nhị phân đầu tiên. Máy tính này hoạt động với các số dấu phẩy động 22 bit, gồm phần mũ 7 bit và phần định trị 15 bit (bao gồm cả bit không hiển thị mà hiểu ngầm, từ đây gọi là bit ẩn), và 1 bit dấu. Máy tính Z3 hoàn thành vào năm 1941 có khả năng thực hiện các phép toán dấu phẩy động, bao gồm cả các trường hợp đặc biệt như vô cực dương, vô cực âm, và không xác định. Khi máy tính số điện tử trở thành thực tế, nhu cầu xử lý dấu phẩy động đã nhanh chóng xuất hiện. Máy tính thương mại đầu tiên với khả năng này trong phần cứng là Z4, sản xuất năm 1950, tiếp theo là IBM 704 vào năm 1954. Sau đó, khả năng xử lý dấu phẩy động trở thành đặc tính kỹ thuật tùy chọn, và các máy tính có khả năng này được gọi là 'máy tính khoa học'. Ngày nay, tất cả máy tính đa dụng đều có khả năng này. Máy tính PDP-11/44, phiên bản mở rộng của 11/34, có bộ nhớ cache và phần xử lý dấu phẩy động như là bộ phận chuẩn.
Máy tính UNIVAC 1100/2200, được giới thiệu vào năm 1962, hỗ trợ hai định dạng dấu phẩy động. Định dạng độ chính xác đơn sử dụng 36 bit, phân chia thành 1 bit dấu, 8 bit phần mũ và 27 bit phần định trị. Định dạng độ chính xác kép dùng 72 bit với 1 bit dấu, 11 bit phần mũ và 60 bit phần định trị. Máy tính IBM 7094, cũng ra mắt cùng năm, hỗ trợ định dạng độ chính xác đơn và kép nhưng có cách tổ chức khác biệt. Trước khi chuẩn IEEE 754 ra đời, các máy tính sử dụng nhiều định dạng dấu phẩy động khác nhau, dẫn đến sự khác biệt về số học và độ chính xác trong cả phần cứng và phần mềm.
- Đưa ra mã hóa cụ thể cho các bit, đảm bảo mọi máy tính tuân thủ chuẩn này đều hiểu cùng một chuỗi bit. Điều này cho phép truyền các số dấu phẩy động giữa các máy tính khác nhau.
- Xác định cách xử lý các phép toán số học, đảm bảo rằng với cùng một chương trình và dữ liệu, mọi máy tính tuân thủ chuẩn đều cho kết quả giống nhau. Điều này giúp giảm thiểu sự không nhất quán trong tính toán dấu phẩy động.
- Xác định rõ các điều kiện đặc biệt như tràn hoặc chia cho zero trong quá trình tính toán, và cho phép kiểm soát chặt chẽ bằng phần mềm.
IEEE 754: chuẩn dấu phẩy động hiện đại trong máy tính
Hiệp hội IEEE đã chuẩn hóa việc biểu diễn số dấu phẩy động nhị phân với chuẩn IEEE 754. Hầu hết các máy tính ngày nay đều tuân theo chuẩn này, ngoại trừ một số trường hợp như máy tính lớn IBM và máy vector Cray. Máy tính lớn IBM ngoài định dạng thập phân và nhị phân IEEE 754 còn sử dụng định dạng riêng. Máy vector Cray, cụ thể là T90, có phiên bản IEEE, trong khi SV1 vẫn sử dụng định dạng dấu phẩy động của Cray.
Chuẩn IEEE 754 cung cấp nhiều định dạng gần gũi nhau, chỉ khác nhau ở một vài chi tiết nhỏ. Năm định dạng trong số này được gọi là định dạng cơ bản, trong đó hai định dạng đặc biệt được sử dụng phổ biến cả trong phần cứng máy tính và ngôn ngữ lập trình.
- Định dạng độ chính xác đơn, được gọi là 'float' trong ngôn ngữ lập trình C và 'real' hoặc 'real4' trong Fortran, sử dụng 32 bit (4 byte) và có độ chính xác phần định trị là 24 bit, tương đương với khoảng 7 chữ số thập phân.
- Định dạng độ chính xác kép, được gọi là 'double' trong ngôn ngữ lập trình C và 'double precision' hoặc 'real8' trong Fortran, sử dụng 64 bit (8 byte) và có độ chính xác phần định trị là 53 bit, tương đương với khoảng 16 chữ số thập phân.
Các định dạng khác bao gồm nhị phân với độ chính xác bậc bốn (128 bit), cũng như dấu phẩy động thập phân (64 bit) và dấu phẩy động thập phân 'kép' (128 bit).
Các định dạng ít phổ biến hơn bao gồm:
- Định dạng độ chính xác mở rộng, với mỗi số chiếm 80 bit.
- Định dạng bán chính xác, còn gọi là dấu phẩy động 16, với mỗi số chiếm 16 bit.
Mọi số nguyên có giá trị tuyệt đối nhỏ hơn hoặc bằng 2 đều có thể được biểu diễn chính xác bằng định dạng độ chính xác đơn, và mọi số nguyên có giá trị tuyệt đối nhỏ hơn hoặc bằng 2 cũng có thể được biểu diễn chính xác bằng định dạng độ chính xác kép.
Mặc dù định dạng 32 bit ('đơn') và 64 bit ('kép') rất phổ biến hiện nay, chuẩn IEEE 754 cũng hỗ trợ nhiều mức độ chính xác khác nhau. Ví dụ, các bộ xử lý như Pentium của Intel và 68000 của Motorola thường sử dụng định dạng độ chính xác mở rộng 80 bit, với phần mũ 15 bit, phần định trị 64 bit (không có bit ẩn) và 1 bit dấu. Một dự án sửa đổi chuẩn IEEE 754 đã được bắt đầu vào năm 2000 và hoàn tất vào tháng 6 năm 2008, bao gồm các định dạng dấu phẩy động thập phân và định dạng dấu phẩy động 16 bit ('nữa'). Định dạng 16 bit nhị phân có cấu trúc tương tự như các định dạng cũ với 1 bit dấu, phần mũ 5 bit và phần định trị 10 bit. Định dạng này hiện đang được sử dụng trong ngôn ngữ đồ họa Cg của NVIDIA và xuất hiện trong chuẩn mở EXR.
Cấu trúc biểu diễn trong máy tính
Thông thường, các số dấu phẩy động được lưu trữ trong bộ nhớ máy tính theo thứ tự từ trái sang phải: bit dấu, phần mũ, và sau cùng là phần định trị. Với định dạng nhị phân IEEE 754, chúng thường được biểu diễn như sau:
Kiểu | Dấu | Phần mũ | Phần định trị | Tổng số bit | Phân cực mũ | Độ chính xác | |
---|---|---|---|---|---|---|---|
Nửa | 1 | 5 | 10 | 16 | 15 | 11 | |
Đơn | 1 | 8 | 23 | 32 | 127 | 24 | |
Kép | 1 | 11 | 52 | 64 | 1023 | 53 | |
Bậc bốn | 1 | 15 | 112 | 128 | 16383 | 113 |
Cần lưu ý rằng phần mũ có thể có giá trị âm hoặc dương, nhưng trong máy tính, phần mũ không được biểu diễn bằng hệ bù 2 mà thay vào đó là một phương pháp khác: phần mũ được biểu diễn dưới dạng số không dấu với một giá trị 'phân cực' cố định. Ví dụ, trong định dạng độ chính xác đơn, giá trị phân cực là +127, nghĩa là để biểu diễn giá trị phần mũ bằng 0, người ta lưu trữ các bit 01111111, tương đương với +127. Tương tự, với giá trị phần mũ 11111110 (+254), giá trị thực phải hiểu là +127 (= 254 – 127). Mỗi định dạng như bán chính xác, độ chính xác đơn, độ chính xác kép đều có giá trị phân cực riêng. Có hai trường hợp đặc biệt: nếu phần mũ có tất cả các bit bằng 0, nó biểu diễn số zero và số không chuẩn hóa; nếu phần mũ có tất cả các bit bằng 1, nó biểu diễn các vô cực và NaN. Giá trị phần mũ của các số chuẩn hóa nằm trong khoảng [-14, 15] với độ chính xác nữa, [-126, 127] với độ chính xác đơn, [-1022, 1023] với độ chính xác kép, và [-16382, 16383] với độ chính xác bậc bốn. Khi nói đến số chuẩn hóa, ta đã loại trừ các số zero, vô cực, NaN và các số không chuẩn hóa.
Cần lưu ý rằng, trong định dạng nhị phân của IEEE, phần định trị luôn có một bit 1 đầu tiên không được lưu trữ trong máy tính, được gọi là bit 'ẩn' hay bit 'hiểu ngầm'. Do đó, mặc dù định dạng độ chính xác đơn có phần định trị gồm 23 bit trong máy tính, thực tế độ chính xác là 24 bit. Tương tự, định dạng độ chính xác kép có độ chính xác 53 bit và độ chính xác bậc bốn là 113 bit. Ví dụ, như đã nêu ở phần trên, số π, khi làm tròn đến độ chính xác 24 bit, có giá trị là:
- dấu = 0; phần mũ e = 1; phần định trị s = 110010010000111111011011 (bao gồm cả bit ẩn)
Tổng của giá trị phân cực cho phần mũ (127) cộng với giá trị phần mũ (1) là 128, do đó, chuỗi 8 bit lưu trữ phần mũ trong máy tính là: 10000000. Cuối cùng, toàn bộ giá trị của số π được lưu trữ dưới định dạng độ chính xác đơn là 0 10000000 10010010000111111011011 (không tính bit ẩn) = 40490FDB (hệ cơ số 16) [1] Lưu trữ 2010-09-30 tại Wayback Machine
Các giá trị đặc biệt
Số không có dấu
Trong chuẩn IEEE 754, có hai loại số không: số 'không dương' (+0) và số 'không âm' (-0). Trong nhiều môi trường, số không dương thường được hiển thị là '0', trong khi số không âm có thể được thể hiện là '-0'. Dù hai giá trị này có cùng giá trị số học, nhưng một số phép toán có thể phân biệt giữa +0 và -0. Ví dụ, a/(-0) cho kết quả là vô cực âm, trong khi a/(+0) cho kết quả là vô cực dương nếu a là số dương. Nếu a là số âm, kết quả sẽ ngược lại. Tuy nhiên, các phép toán này sẽ báo lỗi 'chia cho số không'. Một số phép toán đối xứng dấu như arrcot có thể cho kết quả khác nhau giữa +0 và -0 mà không có thông báo lỗi. Sự khác biệt giữa +0 và -0 thường dễ nhận thấy trong các phép toán phức tạp và các tình huống phân nhánh.
1. Tổng quan
Số thực dấu phẩy động được sử dụng để đại diện cho các số thực trong các phép tính khoa học. Nói chung, một số thực X có thể được biểu diễn bằng dạng số dấu phẩy động theo công thức sau: X = M*R.
Trong đó:
- M là phần định trị (Mantissa)
- R là cơ số (Radix)
- E là phần mũ (Exponent)
2. Chuẩn IEEE754/85
- Cơ số R = 2
- Các định dạng 32, 44, 64, 80 bit
Ví dụ về định dạng 32 bit
1 bit | 8 bit | 23 bit |
---|---|---|
S | e | m |
- S là bit dấu (S = 0 cho số dương)
- e là mã excess của phần mũ E (e = E+127 hoặc E = e-127, với 127 là độ lệch bias)
- m là phần lẽ của phần định trị M (M = 1.m)
Do đó, công thức tính giá trị số thực là: X = (-1)^S * 1.m * 2^E
3. Ví dụ về số thực dấu phẩy động 32 bit theo chuẩn IEEE754/85
1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
- S = 1 -> Đại diện cho số âm (S là bit đầu tiên).
- e = 1000 00102 = 13010 -> E = 130 - 127 = 3 (e là 8 bit tiếp theo).
- m = 101011 -> M = 1.101011 (m là 23 bit còn lại; không cần chú ý đến các bit 0 ở cuối vì khi ghép M = 1.m, các số 0 này không cần viết vào)
X = -1.101011 * 2 = -1101.011 = -13.375 (10 trong hệ nhị phân tương đương với 2 trong hệ thập phân, vì vậy ví dụ 102=210)
Ghi chú
Các kiểu dữ liệu | |
---|---|
Không xác định |
|
Số |
|
Con trỏ |
|
Văn bản |
|
Phức hợp |
|
Khác |
|
Chủ đề liên quan |
|