JavaRush /Blog Java /Random-VI /Bên trong số dấu phẩy động có gì và nó hoạt động như thế ...
Ivan
Mức độ
Харьков

Bên trong số dấu phẩy động có gì và nó hoạt động như thế nào?

Xuất bản trong nhóm

Nội dung:

Hình ảnh: http://pikabu.ru/

Giới thiệu

Trong những ngày đầu tiên học Java, tôi đã gặp một loại nguyên thủy gây tò mò như số dấu phẩy động. Tôi ngay lập tức quan tâm đến các tính năng của chúng và hơn thế nữa là cách chúng được viết bằng mã nhị phân (được kết nối với nhau). Không giống như bất kỳ phạm vi số nguyên nào, ngay cả trong một phạm vi rất nhỏ (ví dụ: từ 1 đến 2) vẫn có vô số số nguyên. Và có kích thước bộ nhớ hữu hạn nên không thể biểu diễn tập hợp này. Vậy chúng được thể hiện dưới dạng nhị phân như thế nào và chúng hoạt động như thế nào? Than ôi, những lời giải thích trên wiki và một bài viết khá hay về Habré ở đây không mang lại cho tôi sự hiểu biết đầy đủ, mặc dù chúng đã đặt nền móng. Việc nhận ra chỉ đến sau khi đọc bài viết phân tích này vào buổi sáng sau khi đọc nó.

Du ngoạn vào lịch sử

( trích từ bài viết này trên Habré ) Vào những năm 60-70, khi máy tính còn lớn và các chương trình còn nhỏ, vẫn chưa có một tiêu chuẩn duy nhất để tính toán, cũng như một tiêu chuẩn để thể hiện chính số dấu phẩy động. Mỗi máy tính thực hiện việc đó một cách khác nhau và mỗi máy đều có lỗi riêng. Nhưng vào giữa những năm 70, Intel đã quyết định tạo ra các bộ xử lý mới với số học “cải tiến” được hỗ trợ, đồng thời tiêu chuẩn hóa nó. Các giáo sư William Kahan và John Palmer (không, không phải tác giả sách về bia) đã được mời đến để phát triển nó. Có một số kịch tính nhưng một tiêu chuẩn mới đã được phát triển. Bây giờ tiêu chuẩn này được gọi là IEEE754

Định dạng số dấu phẩy động

Ngay cả trong sách giáo khoa ở trường, mọi người đều phải đối mặt với một cách viết khác thường những số rất lớn hoặc rất nhỏ có dạng 1,2 × 10 3 hoặc 1,2 E3 , bằng 1,2 × 1000 = 1200 . Đây được gọi là phương pháp ký hiệu số mũ. Trong trường hợp này, chúng ta đang xử lý biểu thức của một số bằng công thức: N=M×n p , trong đó
  • N = 1200 - số kết quả
  • M = 1,2 - mantissa - phần phân số, không tính đến đơn hàng
  • n = 10 là cơ sở thứ tự. Trong trường hợp này và khi chúng ta không nói về máy tính, cơ số là số 10
  • p = 3 - bậc bazơ
Thông thường, cơ sở của đơn hàng được giả định là 10 chỉ có phần định trị và giá trị của cơ sở được viết, phân tách chúng bằng chữ E. Trong ví dụ của chúng tôi, tôi đã đưa ra các mục tương đương 1,2 × 10 31,2 E3 Nếu mọi thứ đều rõ ràng và chúng tôi đã kết thúc chuyến tham quan hoài niệm vào chương trình giảng dạy ở trường, thì bây giờ tôi khuyên bạn nên quên điều này đi, vì khi hình thành một số dấu phẩy động, chúng tôi đang xử lý lũy thừa của hai, không phải hàng chục, tức là n = 2 , toàn bộ công thức hài hòa 1.2E3 bị phá vỡ và nó thực sự làm tôi suy sụp.

Ký hiệu và mức độ

Vậy chúng ta có gì? Kết quả là, chúng ta cũng có một số nhị phân, bao gồm một phần định trị - phần mà chúng ta sẽ nâng lên lũy thừa và chính lũy thừa đó. Ngoài ra, giống như thông thường với các kiểu số nguyên, số dấu phẩy động có một bit xác định dấu - số đó sẽ là dương hay âm. Để làm ví dụ, tôi đề xuất xem xét loại float, bao gồm 32 bit. Với các số có độ chính xác gấp đôi, doublelogic là như nhau, chỉ có số bit nhiều gấp đôi. Trong số 32 bit, bit quan trọng đầu tiên được phân bổ cho dấu, 8 bit tiếp theo được phân bổ cho số mũ - sức mạnh mà chúng ta sẽ tăng phần định trị và 23 bit còn lại - cho phần định trị. Để chứng minh, chúng ta hãy xem một ví dụ: Bên trong số dấu phẩy động có gì và cách thức hoạt động - 1Phần đầu tiên rất đơn giản. Nếu giá trị của bit đầu tiên là 0 thì số chúng ta nhận được sẽ là số dương . Nếu bit là 1 thì số đó sẽ âm . Khối 8 bit tiếp theo là khối số mũ. Số mũ được viết dưới dạng số tám bit thông thường và để đạt được mức yêu cầu, chúng ta cần trừ số kết quả 127. Trong trường hợp của chúng ta, tám bit của số mũ là 10000001 . Điều này tương ứng với số 129 . Nếu bạn có câu hỏi về cách tính toán điều này, thì hình ảnh sẽ hiển thị câu trả lời nhanh chóng. Bạn có thể lấy phiên bản mở rộng trong bất kỳ khóa học đại số Boolean nào. Bên trong số dấu phẩy động có gì và hoạt động như thế nào - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Không khó để tính ra số lớn nhất mà chúng ta có thể lấy được từ 8 bit này là 11111111 2 = 255 10 (chỉ số dưới 210 nghĩa là hệ nhị phân và số thập phân) Tuy nhiên, nếu chúng ta chỉ sử dụng giá trị số mũ dương ( từ 0 đến 255 ) thì kết quả số đó sẽ có nhiều số trước dấu thập phân chứ không có số sau? Để thu được các giá trị âm của độ, bạn cần trừ 127 từ số mũ được tạo . Do đó, phạm vi độ sẽ từ -127 đến 128 . Sử dụng ví dụ của chúng tôi, mức độ yêu cầu sẽ là 129-127 = 2 . Bây giờ chúng ta hãy nhớ con số này.

thần chú

Bây giờ về mantissa. Nó bao gồm 23 bit, nhưng lúc đầu luôn có một đơn vị khác được ngụ ý, trong đó các bit không được phân bổ. Điều này được thực hiện vì lý do hiệu quả và kinh tế. Cùng một số có thể được biểu thị bằng các lũy thừa khác nhau bằng cách thêm số 0 vào phần định trị trước hoặc sau dấu thập phân. Cách dễ nhất để hiểu điều này là dùng số mũ thập phân: 120.000 = 1,2×10 5 = 0,12×10 6 = 0,012×10 7 = 0,0012×10 8 , v.v. Tuy nhiên, bằng cách nhập một số cố định vào phần đầu của mantissa, chúng ta sẽ nhận được các số mới mỗi lần. Hãy coi như điều hiển nhiên là trước 23 bit của chúng ta sẽ có thêm một bit nữa. Thông thường, bit này được phân tách khỏi phần còn lại bằng dấu chấm, tuy nhiên, dấu chấm này không có ý nghĩa gì. Nó chỉ thuận tiện hơn 1. 111000000000000000000000 Bên trong số dấu phẩy động có gì và hoạt động như thế nào - 3Bây giờ, mantissa kết quả cần được nâng lên lũy thừa từ trái sang phải, giảm lũy thừa một cho mỗi bước. Chúng ta bắt đầu từ giá trị lũy thừa mà chúng ta thu được từ phép tính, tức là 2 (Tôi đã cố tình chọn một ví dụ đơn giản để không viết từng giá trị lũy thừa của hai và không tính chúng vào bảng trên khi bit tương ứng bằng 0) Bên trong số dấu phẩy động có gì và hoạt động như thế nào - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7.5 và nhận được kết quả 7.5 , có thể kiểm tra tính chính xác, ví dụ tại liên kết này

Kết quả

Một số dấu phẩy động tiêu chuẩn floatbao gồm 32 bit, bit đầu tiên là dấu (+ hoặc -), 8 số tiếp theo là số mũ, 23 số tiếp theo là dấu mantissa By - nếu bit 0 là số dương. Nếu bit 1 âm. Theo cấp số nhân - chúng ta chuyển đổi từng bit thành số thập phân (bit đầu tiên từ bên trái là 128 , bit thứ hai là 64 , bit thứ ba là 32 , bit thứ tư là 16 , bit thứ năm là 8 , bit thứ sáu là 4 , bit thứ bảy là 2 , thứ tám là 1 ), trừ đi 127 từ số kết quả , chúng ta sẽ có được mức độ mà chúng ta sẽ bắt đầu. Theo mantissa - đối với 23 bit hiện có ở phía trước, chúng ta thêm một bit khác có giá trị 1 và từ đó chúng ta bắt đầu tăng công suất mà chúng ta nhận được, giảm công suất này theo từng bit tiếp theo. Đó là tất cả mọi người, trẻ em! Bên trong số dấu phẩy động có gì và cách thức hoạt động - 5Tái bút: Khi làm bài tập về nhà, sử dụng bài viết này, hãy để lại nhận xét về phiên bản của bạn tại sao xảy ra lỗi chính xác với một số lượng lớn các phép tính số học với số dấu phẩy động
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION