Số điểm cố định so với số dấu chấm động


109

Tôi chỉ không thể hiểu số điểm cố định và số dấu phẩy động do khó đọc các định nghĩa về chúng trên Google. Nhưng không có cái nào tôi đã đọc cung cấp một lời giải thích đủ đơn giản về chúng thực sự là gì. Tôi có thể lấy một định nghĩa đơn giản với ví dụ không?


Tôi cũng đang gặp khó khăn trong việc tìm kiếm một định nghĩa tốt. Điều chính tôi đang tìm kiếm là thứ gì đó để giúp tôi hiểu các kết quả này: 3,11 + 42,0 = 45.110001 (không phải 45,11), 3,12 + 42,0 = 45,119999 (không phải 45,12), 3,15 + 42,0 = 45,150002 (không phải 45,15).
Bart S.

1
Tôi nghĩ đây là một cuộc thảo luận có liên quan (đặc biệt là mô tả các bẫy với số nổi và độ chính xác tốt hơn với điểm cố định và tại sao bạn không bao giờ muốn kiếm tiền như một chiếc phao. Stackoverflow.com/questions/6320209/…
Andrew Norman

Liên kết ngẫu nhiên nơi các chủ đề được đề cập "OpenGL® ES OpenGL ES bao gồm các cấu hình cho các hệ thống dấu phẩy động và điểm cố định và đặc điểm kỹ thuật EGL ™ ..."
The Red Pea

Câu trả lời:


145

Một số điểm cố định có một số bit (hoặc chữ số) cụ thể dành riêng cho phần nguyên (phần ở bên trái của dấu thập phân) và một số bit cụ thể được dành riêng cho phần thập phân (phần ở bên phải của số thập phân điểm). Bất kể số của bạn lớn hay nhỏ, nó sẽ luôn sử dụng cùng một số bit cho mỗi phần. Ví dụ: nếu định dạng điểm cố định của bạn ở dạng thập phân IIIII.FFFFFthì số lớn nhất bạn có thể đại diện sẽ là 99999.99999và số nhỏ nhất khác 0 sẽ là 00000.00001. Mỗi bit mã xử lý các số như vậy phải có kiến ​​thức tích hợp về vị trí của dấu thập phân.

Số dấu phẩy động không dành riêng một số bit cụ thể cho phần nguyên hoặc phần phân số. Thay vào đó, nó dự trữ một số bit nhất định cho số (được gọi là phần định trị hoặc phần lớn ) và một số bit nhất định để cho biết vị trí thập phân nằm ở đâu trong số đó (gọi là số mũ ). Vì vậy, một số dấu phẩy động có tới 10 chữ số với 2 chữ số dành riêng cho số mũ có thể biểu thị giá trị lớn nhất của 9.9999999e+50và giá trị khác 0 nhỏ nhất của 0.0000001e-49.


8
Bạn đang quên rằng số dấu phẩy động hầu như luôn luôn có dấu, vì vậy giá trị tối thiểu thực sự sẽ là -9.9999999e+50.
Brian Gordon

4
Ngoài ra, còn có xu hướng số mũ để bạn có thể biểu diễn các giá trị rời rạc hơn rất nhiều giữa 0 và 1 so với bạn có thể từ 1.000.000 đến 1.000.001. Và có rất nhiều phức tạp với các phép toán dấu phẩy động xuất hiện, chẳng hạn như đảm bảo bạn không báo cáo 0 vì sự khác biệt giữa hai số rất giống nhau khi độ lệch không đủ để tăng độ chính xác.
Brian Gordon

28
@BrianGordon: Tôi không quên các bit ký hiệu; Tôi cố tình bỏ qua chúng để có một mô tả đơn giản và không phải lo lắng về sự khác biệt giữa tối thiểu / tối đa và nhỏ nhất / lớn nhất. Tôi cũng cố ý loại bỏ xu hướng lũy ​​thừa (không liên quan gì đến số lượng giá trị rời rạc giữa hai số bất kỳ), NaN, số nguyên, chuẩn hóa, dòng chảy dần, số 0 có dấu, thực tế là hầu hết các số trôi nổi là nhị phân (cho phép bit đầu tiên của phần định trị bị loại bỏ), và một số khía cạnh khác không cần thiết để minh họa khái niệm.
Gabe

2
Tại sao lại là ngưỡng cho số điểm cố định tối thiểu 00000.00001? Tôi đang mong đợi để xem 00000.00000thay thế. Ngoài ra, bạn có bất kỳ tài liệu tham khảo nào chi tiết hơn về số điểm cố định không?
Nicholas Miller,

4
@NickMiller: Xin lỗi vì sự nhầm lẫn, nhưng tôi đang nói về các số khác 0. Định dạng ví dụ của tôi có thể đại diện cho 0, 0,00001, 0,00002, ..., 99999.99998, 99999.99999.
Gabe

31

Số điểm cố định chỉ có nghĩa là có một số chữ số cố định sau dấu thập phân. Số dấu phẩy động cho phép một số chữ số khác nhau sau dấu thập phân.

Ví dụ: nếu bạn có một cách lưu trữ số yêu cầu chính xác bốn chữ số sau dấu thập phân, thì đó là điểm cố định. Nếu không có hạn chế đó, nó là dấu chấm động.

Thông thường, khi sử dụng điểm cố định, lập trình viên thực sự sử dụng một số nguyên và sau đó đưa ra giả định rằng một số chữ số nằm ngoài dấu thập phân. Ví dụ: tôi có thể muốn giữ hai chữ số chính xác, vì vậy giá trị 100 có nghĩa là thực sự có nghĩa là 1,00, 101 có nghĩa là 1,01, 12345 nghĩa là 123,45, v.v.

Số dấu phẩy động có mục đích chung hơn vì chúng có thể biểu diễn các số rất nhỏ hoặc rất lớn theo cùng một cách, nhưng có một hình phạt nhỏ là phải có thêm bộ nhớ cho vị trí thập phân.


2
Việc sử dụng dấu phẩy động sẽ trở thành một vấn đề khi bạn bắt đầu thực hiện các phép tính với chúng, chẳng hạn như nếu bạn thêm một số thực sự nhỏ và một số thực sự lớn với nhau. Kết quả tổng hợp mất độ chính xác vì nó phải biểu diễn một số có hai cực trị và các số thập phân thấp hơn bị cắt bớt (và không được làm tròn).
Andrew Norman

2
Ngoài ra, việc sử dụng tiềm năng các giá trị số mũ trong dấu phẩy động có thể gây ra sự cố với các hệ thống máy tính mong đợi số chuẩn
Andrew Norman

5

Theo hiểu biết của tôi, số học điểm cố định được thực hiện bằng cách sử dụng số nguyên. trong đó phần thập phân được lưu trữ trong một lượng bit cố định hoặc số được nhân với bao nhiêu chữ số của độ chính xác thập phân là cần thiết.

Ví dụ: Nếu số 12.34cần được lưu trữ và chúng ta chỉ cần hai chữ số chính xác sau dấu thập phân, thì số đó được nhân với 100để lấy 1234. Khi thực hiện phép toán trên số này, chúng tôi sẽ sử dụng bộ quy tắc này. Thêm 5620hoặc 56.20vào số này sẽ mang lại 6854dữ liệu hoặc 68.54.

Nếu chúng ta muốn tính toán phần thập phân của một số điểm cố định, chúng ta sử dụng toán hạng modulo (%).

12,34 (mã giả):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Số dấu phẩy động là một câu chuyện hoàn toàn khác trong lập trình. Tiêu chuẩn hiện tại cho số dấu phẩy động sử dụng thứ gì đó như 23 bit cho dữ liệu của số, 8 bit cho số mũ và 1 nhưng cho dấu. Xem liên kết Wikipedia này để biết thêm thông tin về điều này.


3

Thuật ngữ 'điểm cố định' đề cập đến cách tương ứng trong đó các số được biểu diễn, với một số chữ số cố định sau và đôi khi trước dấu thập phân. Với biểu diễn dấu phẩy động, vị trí của dấu thập phân có thể 'nổi' so với các chữ số có nghĩa của số. Ví dụ: biểu diễn điểm cố định với quy ước vị trí dấu thập phân thống nhất có thể đại diện cho các số 123,45, 1234.56, 12345.67, v.v., trong khi biểu diễn dấu phẩy động ngoài ra có thể đại diện cho 1.234567, 123456.7, 0,00001234567, 1234567000000000, v.v.


-6

Lấy số 123.456789

  • Là một số nguyên, số này sẽ là 123
  • Là một điểm cố định (2), con số này sẽ là 123,46 (Giả sử bạn làm tròn nó lên)
  • Dưới dạng dấu phẩy động, con số này sẽ là 123,456789

Dấu phẩy động cho phép bạn biểu diễn hầu hết mọi số với độ chính xác cao. Cố định ít chính xác hơn, nhưng đơn giản hơn cho máy tính ..


11
Độ chính xác mà bạn có thể viết một số không liên quan đến việc nó được viết bằng dấu phẩy động, số nguyên hay dấu chấm cố định. Nó liên quan đến số chữ số có nghĩa mà bạn có sẵn. Ví dụ: INT_MAX là một số có thể được biểu diễn chính xác dưới dạng int, nhưng không phải là số thực vì chúng không có độ chính xác 31 bit cần thiết để biểu diễn chính xác.
Kian

1
cố định là chính xác nhất miễn là nó có kích thước để xử lý số được đề cập. Khi bạn làm toán với số điểm cố định, việc làm tròn xảy ra khi một phép tính có phần dư vượt quá giới hạn thập phân. Với dấu phẩy động, bạn có thể nhận được một giá trị không chính xác nếu bạn thêm một số rất nhỏ với một số rất lớn. Khi điều đó xảy ra, các chữ số bị mất mà không làm tròn
Andrew Norman

Điều này gây hiểu lầm và sai lầm. Điểm cố định có nghĩa là số chữ số sau dấu thập phân được cố định. Nó không nói gì về độ chính xác của nó.
Oscar Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.