Số âm được lưu trữ trong bộ nhớ máy tính như thế nào? Những điều bạn cần biết về số học dấu phẩy động

Biểu diễn số trong máy tính

Số nguyên là dữ liệu số đơn giản nhất mà máy tính hoạt động. Số nguyên được lưu trữ trong máy tính ở dạng điểm cố định. Trong trường hợp này, mỗi chữ số của ô nhớ luôn tương ứng với cùng một chữ số của số đó và dấu phẩy nằm ở bên phải sau chữ số có nghĩa nhỏ nhất.

Để lưu trữ toàn bộ số âm một ô nhớ được phân bổ 1 byte (8 bit), tức là phạm vi số có thể được lưu trữ trong bộ nhớ truy cập tạm thờiở định dạng số nguyên không âm, từ 0 đến 255 (tổng cộng là 256). Số 0 tối thiểu tương ứng với tám số không và số tối đa 255 tương ứng với tám số một (255 10 = 11111111 2).

Để biểu thị một số nguyên có dấu, bit có nghĩa nhất (trái) được phân bổ cho dấu của số đó, các bit còn lại được phân bổ cho chính số đó. Nếu số dương thì 0 được đặt trong bit dấu, nếu âm - 1. Ví dụ: trong một byte, bạn có thể biểu thị số đã ký từ -128 đến 127.

biểu diễn máy tính số nguyên thường sử dụng một, hai hoặc bốn byte, nghĩa là ô nhớ sẽ có độ dài tương ứng là tám, mười sáu hoặc ba mươi hai bit.

Biểu diễn một số ở dạng thông thường "ký" - "cường độ", trong đó chữ số có nghĩa nhất của ô được phân bổ cho dấu và phần còn lại - để ghi số trong hệ thống nhị phân, gọi điện mã trực tiếp của số nhị phân.

Ví dụ, mã trực tiếp số nhị phân 1001 và -1001 cho ô 8 bit lần lượt là 0 0001001 và 1 0001001.

Số dương luôn được biểu diễn trong máy tính bằng mã trực tiếp. Mã trực tiếp của số hoàn toàn trùng khớp với việc ghi chính số đó vào ô của máy.

Mã trực tiếp của số âm chỉ khác với mã trực tiếp của số dương tương ứng ở nội dung của bit dấu.
Nhưng số nguyên âm không được biểu diễn trong máy tính bằng mã trực tiếp; chúng được biểu diễn bằng mã bổ sung.

Mã bù hai của một số dương bằng mã trực tiếp của số đó.

Mã bù hai của số âm m là 2 n -|m|, trong đó n là số chữ số trong ô.

Mã bổ sung được sử dụng để thực hiện các phép tính số học dễ dàng hơn. Nếu như Máy thanh toán làm việc với các mã trực tiếp của số dương và số âm, thì khi thực hiện các phép tính số học cần phải thực hiện một chuỗi hành động bổ sung. Ví dụ, khi cộng, người ta cần kiểm tra dấu của cả hai toán hạng và xác định dấu của kết quả. Nếu các dấu giống nhau thì tổng các toán hạng được tính và gán cùng dấu. Nếu các dấu hiệu khác nhau thì từ cái lớn hơn giá trị tuyệt đối số nhỏ hơn bị trừ đi và kết quả được gán một dấu hiệu hơn. Nghĩa là, với cách biểu diễn số này (chỉ ở dạng mã trực tiếp), phép cộng được thực hiện thông qua một thuật toán khá phức tạp. Nếu các số âm được biểu diễn dưới dạng mã bổ sung, thì phép cộng, bao gồm cả các phép tính có dấu khác nhau, sẽ được giảm xuống thành phép cộng theo bit của chúng.

Thuật toán lấy mã bổ sung của số âm.

Để có được mã k-bit bổ sung của số âm, bạn phải:

    mô-đun của số âm được biểu thị bằng mã trực tiếp bằng chữ số nhị phân k;

    đảo ngược giá trị của tất cả các bit: thay thế tất cả số 0 bằng số 1 và số 1 bằng số 0, do đó, thu được mã ngược k-bit của số ban đầu);

    đến nhận được mã ngược cộng một.

Ví dụ:

Chúng tôi nhận được mã bổ sung 8 bit cho số -52:
00110100 - số |-52|=52 trong mã trực tiếp
11001011 - số -52 ở mã ngược
11001100 - số -52 trong mã bổ sung

Hiệu suất số thực trong máy tính.

Để biểu diễn số thực trong máy tính hiện đại phương pháp được chấp nhận biểu diễn dấu phẩy động.

Phương pháp biểu diễn này dựa trên ký hiệu chuẩn hóa (theo cấp số nhân) của số thực.
Ký hiệu khác 0 được chuẩn hóa số thực A là một bản ghi như:
A= m* qn ,
Ở đâu
m - phần định trị của số ( phần thích hợp, trong đó chữ số đầu tiên sau dấu thập phân không bằng 0),
q là cơ sở của hệ thống,
n - thứ tự số.

Ví dụ:
1. 3,1415926 = 0, 31415926 * 101;
2. 1000=0,1 * 104;
3. 0,123456789 = 0,123456789 * 100;
4. 0,00001078 = 0,1078 * 8-4; (thứ tự được viết theo hệ thống thứ 10)
5. 1000,00012 = 0, 100000012 * 24.

Khi biểu diễn số dấu phẩy động, một phần các chữ số của ô được phân bổ để ghi thứ tự của số, các chữ số còn lại được phân bổ để ghi phần định trị. Một chữ số trong mỗi nhóm được phân bổ để mô tả ký hiệu thứ tự và ký hiệu mantissa.

Thời xa xưa, đối với ngành CNTT thì đây là những năm 70 của thế kỷ trước, các nhà toán học (trước đây gọi là lập trình viên) đã chiến đấu như Don Quixote trong một cuộc chiến không cân sức với máy tính khi đó có kích thước bằng những chiếc cối xay gió nhỏ. Các nhiệm vụ rất nghiêm túc: tìm kiếm tàu ​​ngầm địch trên đại dương bằng cách sử dụng hình ảnh từ quỹ đạo, tính toán đường đạn của tên lửa. tầm xa, Và như thế. Để giải chúng, máy tính phải hoạt động với các số thực, như chúng ta biết, là một dãy liên tục, trong khi bộ nhớ là hữu hạn. Do đó, chúng ta phải ánh xạ sự liên tục này vào một tập hợp hữu hạn các số 0 và số 1. Để tìm kiếm sự dung hòa giữa tốc độ, kích thước và độ chính xác của cách biểu diễn, các nhà khoa học đã đề xuất số dấu phẩy động (hoặc dấu phẩy động, nếu thuộc giai cấp tư sản).

Vì lý do nào đó, số học dấu phẩy động được coi là một lĩnh vực kỳ lạ khoa học máy tính, vì các kiểu dữ liệu tương ứng có trong mọi ngôn ngữ lập trình. Thành thật mà nói, tôi chưa bao giờ coi trọng số học máy tính, khi giải cùng một bài toán trên CPU và GPU, tôi nhận được kết quả khác nhau. Hóa ra những hiện tượng rất kỳ lạ và kỳ lạ đang ẩn giấu trong những góc bí mật của khu vực này: tính không giao hoán và không liên kết của các phép toán số học, số 0 có dấu, hiệu của các số khác nhau cho số 0, v.v. Nguồn gốc của tảng băng trôi này đi sâu vào toán học, và dưới phần cắt này, tôi sẽ cố gắng chỉ phác thảo những gì nằm trên bề mặt.

1. Khái niệm cơ bản

Tập hợp các số nguyên là vô hạn, nhưng chúng ta luôn có thể chọn một số bit để biểu diễn bất kỳ số nguyên nào phát sinh khi giải nhiệm vụ cụ thể. Tập hợp số thực không chỉ là vô hạn mà còn liên tục nên dù lấy bao nhiêu bit đi chăng nữa, chúng ta chắc chắn sẽ gặp phải những số không có cách biểu diễn chính xác. Số dấu phẩy động là một trong những những cách có thể biểu diễn số thực, là sự đánh đổi giữa độ chính xác và phạm vi giá trị được chấp nhận.

Một số dấu phẩy động bao gồm một tập hợp các chữ số riêng lẻ, được chia theo quy ước thành dấu, số mũ và phần định trị. Số mũ và phần định trị là các số nguyên, cùng với dấu, biểu diễn một số dấu phẩy động trong mẫu sau:

Về mặt toán học nó được viết như thế này:

(-1) s × M × B E, trong đó s là dấu, B là cơ số, E là số mũ và M là phần định trị.

Cơ số xác định hệ thống chữ số. Về mặt toán học, người ta đã chứng minh rằng các số dấu phẩy động có cơ số B=2 (biểu diễn nhị phân) có khả năng chống lại các lỗi làm tròn tốt nhất, do đó trong thực tế chỉ gặp cơ số 2 và ít phổ biến hơn là cơ số 10. Để trình bày thêm, chúng ta sẽ luôn giả sử B= 2 và công thức tính số có dấu phẩy động sẽ như sau:

(-1) s × M × 2 E

Mantissa và trật tự là gì? thần chú là một số nguyên có độ dài cố định biểu thị các bit quan trọng nhất của một số thực. Giả sử phần định trị của chúng ta bao gồm ba bit (|M|=3). Lấy ví dụ: số "5", số này trong hệ nhị phân sẽ bằng 101 2. Bit quan trọng nhất tương ứng với 2 2 = 4, bit ở giữa (mà chúng ta có bằng 0) 2 1 =2, và em út 2 0 =1. Đặt hàng– đây là lũy thừa cơ số (hai) của chữ số cao nhất. Trong trường hợp của chúng tôi E=2. Thật thuận tiện khi viết những con số như vậy trong cái gọi là "khoa học" mẫu, ví dụ "1,01e+2". Rõ ràng ngay rằng lớp phủ bao gồm ba dấu hiệu, và thứ tự là hai.

Giả sử chúng ta muốn có được một số phân số, sử dụng cùng 3 bit của phần định trị. Chúng ta có thể làm được điều này nếu lấy E=1. Khi đó số của chúng ta sẽ bằng nhau

1,01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0,5=2,5

Ở đây, vì E=1, lũy thừa của hai chữ số đầu tiên (trước dấu thập phân) là “1”. Hai chữ số còn lại nằm ở bên phải (sau dấu thập phân) đóng góp lần lượt là 2 E-1 và 2 E-2 (tương ứng là 2 0 và 2 -1). Rõ ràng là bằng cách điều chỉnh E, cùng một số có thể được biểu diễn theo nhiều cách khác nhau. Hãy xem xét một ví dụ với độ dài của lớp phủ |M|=4. Số “2” có thể được biểu diễn như sau:

2 = 10 (ở dạng nhị phân) = 1,000e+1 = 0,100e+2 = 0,010e+3. (E=1, E=2, E=3 tương ứng)

Xin lưu ý rằng cùng một số có nhiều cách biểu diễn. Điều này không thuận tiện cho thiết bị, bởi vì... cần tính đến tính đa bội của cách biểu diễn khi so sánh các số và khi thực hiện các phép tính số học trên chúng. Hơn nữa, nó không kinh tế vì số lượng biểu diễn là hữu hạn và sự lặp lại làm giảm số lượng các số có thể được biểu diễn. Do đó, ngay từ những chiếc máy đầu tiên, họ đã bắt đầu sử dụng một thủ thuật, làm cho phần đầu tiên của lớp phủ luôn dương. Bài trình bày này được gọi là bình thường hóa.

Điều này tiết kiệm một bit vì bit ẩn không cần được lưu trữ trong bộ nhớ và đảm bảo rằng số được biểu diễn duy nhất. Trong ví dụ của chúng tôi, “2” có một biểu diễn chuẩn hóa duy nhất (“1.000e+1”) và phần định trị được lưu trong bộ nhớ dưới dạng “000”, bởi vì đơn vị dẫn đầu được ngầm hiểu. Nhưng trong cách biểu diễn chuẩn hóa của các số phát sinh vấn đề mới- không thể biểu diễn số 0 ở dạng này.

Nói đúng ra, một số chuẩn hóa có dạng sau:

(-1) s × 1.M × 2 E .

Chất lượng giải quyết vấn đề phần lớn phụ thuộc vào việc lựa chọn biểu diễn dấu phẩy động. Chúng tôi dần dần tiếp cận vấn đề tiêu chuẩn hóa cách biểu diễn như vậy.

2. Một chút lịch sử

Trong những năm 60 và 70, không có một tiêu chuẩn duy nhất nào để biểu diễn số dấu phẩy động, phương pháp làm tròn hoặc các phép tính số học. Kết quả là các chương trình cực kỳ không thể chuyển đổi được. Nhưng cũng vấn đề lớn hơnđã có cái gì máy tính khác nhau có một số “điều kỳ lạ” và chúng phải được biết và tính đến trong chương trình. Ví dụ: hiệu của hai số không bằng nhau sẽ trả về 0. Kết quả là các biểu thức “X=Y” và “X-Y=0” xung đột với nhau. Những người thợ thủ công đã giải quyết vấn đề này bằng những thủ thuật rất thông minh, chẳng hạn như gán “X=(X-X)+X” trước các phép tính nhân và chia để tránh rắc rối.

Sáng kiến ​​tạo ra tiêu chuẩn đơn vì việc biểu diễn các số dấu phẩy động trùng khớp một cách đáng ngờ với những nỗ lực vào năm 1976 của Intel nhằm phát triển số học "tốt hơn" cho bộ đồng xử lý 8086 và i432 mới. Sự phát triển được thực hiện bởi các nhà khoa học trong lĩnh vực này, GS. John Palmer và William Kahan. Sau đó, trong một cuộc phỏng vấn, bày tỏ quan điểm rằng mức độ nghiêm túc trong việc phát triển số học của Intel đã buộc các công ty khác phải đoàn kết và bắt đầu quá trình tiêu chuẩn hóa.

Mọi người đều nghiêm túc vì việc quảng bá kiến ​​trúc của bạn và biến nó thành tiêu chuẩn sẽ rất có lợi. DEC, National Superconductor, Zilog và Motorola đã trình bày đề xuất của họ. Các nhà sản xuất máy tính lớn Cray và IBM đã theo dõi từ bên lề. Công ty Intel, tất nhiên, cũng trình bày số học mới của cô ấy. Các tác giả của đặc tả được đề xuất là William Kahan, Jeromy Kunen và Harold Stone, và đề xuất của họ ngay lập tức được đặt biệt danh là “K-C-S”.

Gần như ngay lập tức, tất cả ngoại trừ hai đề xuất đều bị từ chối: VAX từ DEC và "K-C-S" từ Intel. Đặc tả VAX đơn giản hơn nhiều, nó đã được triển khai trong các máy tính PDP-11 và rõ ràng là làm thế nào để có được hiệu suất tối đa. Mặt khác, "K-C-S" chứa rất nhiều chức năng hữu ích, chẳng hạn như số "đặc biệt" và "không chuẩn hóa" (chi tiết bên dưới).

Trong “K-C-S”, tất cả các thuật toán số học đều được chỉ định nghiêm ngặt và yêu cầu kết quả khi thực hiện phải trùng khớp với chúng. Điều này cho phép thực hiện các tính toán nghiêm ngặt trong phạm vi thông số kỹ thuật này. Nếu trước đây một nhà toán học giải một bài toán bằng phương pháp số và chứng minh các tính chất của lời giải thì không có gì đảm bảo rằng các tính chất này sẽ được giữ nguyên trong chương trình. Tính chính xác của số học K-C-S giúp chứng minh các định lý bằng cách sử dụng số học dấu phẩy động.

DEC đã làm mọi thứ để biến thông số kỹ thuật của mình thành tiêu chuẩn. Cô thậm chí còn tranh thủ sự hỗ trợ của một số nhà khoa học có uy tín mà về nguyên tắc, số học K-C-S không thể đạt được hiệu suất tương tự như DEC. Điều trớ trêu là Intel biết cách làm cho thông số kỹ thuật của mình đạt hiệu suất cao, nhưng những thủ thuật này lại là bí mật thương mại. Nếu Intel không nhượng bộ và tiết lộ một số bí mật của mình thì hãng này đã không thể kìm hãm được sự tấn công dữ dội của DEC.

Để biết thêm về các cuộc chiến tiêu chuẩn hóa, hãy xem cuộc phỏng vấn của Giáo sư Kahan và chúng ta sẽ xem biểu diễn dấu phẩy động trông như thế nào bây giờ.

3. Biểu diễn số dấu phẩy động ngày nay

Các nhà phát triển K-C-S đã chiến thắng và giờ đây đứa con tinh thần của họ đã trở thành chuẩn IEEE754. Nó biểu thị các số dấu phẩy động dưới dạng dấu (s), mantissa (M) và số mũ (E) như sau:

(-1)s × 1.M × 2 E

Bình luận. Trong tiêu chuẩn IEE754-2008 mới, ngoài các số có cơ số 2, còn có các số có cơ số 10, được gọi là số thập phân(thập phân) số dấu phẩy động.

Để không làm người đọc choáng ngợp với quá nhiều thông tin có thể tìm thấy trên Wikipedia, chúng tôi sẽ chỉ xem xét một loại dữ liệu, độ chính xác đơn (float). Các số có độ chính xác một nửa, gấp đôi và mở rộng có cùng đặc điểm nhưng có phạm vi thứ tự và giá trị khác nhau. Trong các số có độ chính xác đơn (float/single), thứ tự bao gồm 8 bit và phần định trị - là 23. Thứ tự hiệu quả được xác định là E-127. Ví dụ: số 0,15625 sẽ được lưu trong bộ nhớ dưới dạng

Hình lấy từ Wikipedia

Trong ví dụ này:

  • Dấu s=0 (số dương)
  • Lệnh E=01111100 2 -127 10 = -3
  • Mantissa M = 1,01 2 (đơn vị đầu tiên không rõ ràng)
  • Kết quả là số F = 1,01 2 e-3 = 2 -3 +2 -5 = 0,125 + 0,03125 = 0,15625

Giải thích chi tiết hơn một chút

Ở đây chúng ta đang xử lý biểu diễn nhị phân của số “101” với dấu thập phân được dịch chuyển sang trái một số vị trí. 1,01 là biểu diễn nhị phân có nghĩa là 1×2 0 + 0×2 -1 + 1×2 -2 . Di chuyển dấu thập phân sang trái ba vị trí, chúng ta được 1×2 -3 + 0×2 -4 + 1×2 -5 = 1×0.125 + 0×0.0625 + 1×0.03125 = 0.125 + 0 . 03125 = 0,15625.

3.1 Các số đặc biệt: số 0, vô cực và độ bất định
Trong IEEE754, số "0" được biểu thị bằng một giá trị có thứ tự bằng E=E min -1 (đối với số đơn này là -127) và giá trị bằng 0. Việc đưa số 0 vào như một số độc lập (vì số 0 không thể được biểu diễn dưới dạng biểu diễn chuẩn hóa) giúp tránh được nhiều điều kỳ lạ trong số học. Và mặc dù các phép toán với số 0 phải được xử lý riêng biệt nhưng chúng thường được thực hiện nhanh hơn so với các số thông thường.

IEEE754 cũng cung cấp cách biểu diễn các số đặc biệt mà hoạt động của chúng gây ra ngoại lệ. Những con số này bao gồm vô cực (±∞) và độ không chắc chắn (NaN). Những con số này cho phép bạn trả về một giá trị phù hợp trong trường hợp tràn. Vô số được biểu diễn dưới dạng số có thứ tự E=E max +1 và không có giá trị nào. Bạn có thể nhận được vô tận với tràn và chia số khác 0 về không. Các nhà phát triển đã xác định tính vô hạn trong phép chia dựa trên sự tồn tại của các giới hạn khi số bị chia và số chia có xu hướng tiến về một số nhất định. Theo đó, c/0==±∞ (ví dụ: 3/0=+∞ và -3/0=-∞), vì nếu số bị chia có xu hướng không đổi và số chia có xu hướng bằng 0, thì giới hạn bằng vô cực. Tại 0/0 không có giới hạn nên kết quả sẽ không chắc chắn.

Tính không chắc chắn hoặc NaN (không phải số) là một cách biểu diễn được phát minh ra để phép tính số học luôn có thể trả về một số giá trị vô nghĩa. Trong IEEE754, NaN được biểu diễn dưới dạng một số trong đó E=E max +1 và phần định trị khác không. Mọi thao tác với NaN đều trả về NaN. Nếu muốn, bạn có thể ghi thông tin vào mantissa mà chương trình có thể diễn giải. Điều này không được quy định trong tiêu chuẩn và phần định trị thường bị bỏ qua.

Làm thế nào bạn có thể có được NaN? Bằng một trong những cách sau:

  • ∞+(- ∞)
  • 0 × ∞
  • 0/0, ∞/∞
  • sqrt(x), trong đó x<0
Theo định nghĩa, NaN ≠ NaN, do đó, để kiểm tra giá trị của một biến, bạn chỉ cần so sánh nó với chính nó.
Tại sao số 0 có dấu (hoặc +0 so với -0)
Người đọc tò mò có lẽ đã nhận thấy rằng trong cách biểu diễn số dấu phẩy động được mô tả có hai số 0 chỉ khác nhau về dấu. Vì vậy, 3·(+0)=+0, và 3·(-0)=-0. Nhưng khi so sánh +0=-0. Trong tiêu chuẩn, dấu được giữ lại một cách có chủ ý để các biểu thức do tràn hoặc tràn dưới biến thành vô cực hoặc 0 vẫn có thể cho kết quả chính xác nhất khi nhân và chia. Ví dụ: nếu số 0 không có dấu thì biểu thức 1/(1/x)=x sẽ không đúng tại x=±∞, vì 1/∞ và 1/-∞ đều bằng 0.

Một ví dụ nữa:
(+∞/0) + ∞ = +∞, trong khi (+∞/-0) +∞ = NaN

Tại sao vô cực lại tốt hơn NaN trong trường hợp này? Vì nếu NaN xuất hiện trong một biểu thức số học thì kết quả của toàn bộ biểu thức sẽ luôn là NaN. Nếu biểu thức gặp vô cùng thì kết quả có thể bằng 0, vô cực hoặc số dấu phẩy động thông thường. Ví dụ: 1/∞=0.

3.3 Số không chuẩn hóa
Chúng ta hãy xem những số không chuẩn hóa dưới chuẩn hóa nào đang sử dụng một ví dụ đơn giản. Chúng ta hãy có một biểu diễn chuẩn hóa với độ dài mantissa |M|=2 bit (+ một bit chuẩn hóa) và một phạm vi các giá trị theo thứ tự -1Các nét lớn hiển thị các số có phần định trị bằng 1,00. Có thể thấy khoảng cách từ số 0 đến số gần nhất (0 - 0,5) lớn hơn khoảng cách từ số này đến số tiếp theo (0,5 - 0,625). Điều này có nghĩa là hiệu giữa hai số bất kỳ từ 0,5 đến 1 sẽ bằng 0, ngay cả khi các số này không bằng nhau. Điều tệ hơn nữa là sự khác biệt giữa các số lớn hơn 1 rơi vào khoảng cách giữa 0,5 và 0. Ví dụ: “1,5-1,25=0” (xem hình).

Không phải chương trình nào cũng rơi vào “lỗ gần 0”. Theo thống kê từ những năm 70, trung bình mỗi máy tính gặp phải sự cố này mỗi tháng một lần. Xét thấy máy tính ngày càng trở nên phổ biến, các nhà phát triển K-C-S coi vấn đề này đủ nghiêm trọng để giải quyết ở cấp độ phần cứng. Giải pháp họ đề xuất như sau. Chúng ta biết rằng với E=E min -1 (đối với float thì đây là “-127”) và giá trị bằng 0, số này được coi là bằng 0. Nếu phần định trị không bằng 0 thì số đó được coi là không bằng 0, thứ tự của nó được đặt thành E=E min và bit cao ẩn của phần định trị được đặt thành 0. Những con số như vậy được gọi là không chuẩn hóa.

Nói đúng ra, số dấu phẩy động bây giờ trông giống như:

(-1) s × 1.M × 2 E nếu E min ≤E

(-1) s × 0.M × 2 Emin nếu E=E phút -1. (số không chuẩn hóa)

Hãy quay lại ví dụ. E phút của chúng tôi = -1. Hãy giới thiệu một giá trị đơn hàng mới, E=-2, tại đó các số không được chuẩn hóa. Kết quả là chúng ta có được một cách biểu diễn mới của các số:

Khoảng từ 0 đến 0,5 chứa đầy các số không chuẩn hóa, giúp không thể thất bại trong các ví dụ 0 được thảo luận ở trên (0,5-0,25 và 1,5-1,25). Điều này làm cho việc biểu diễn trở nên chắc chắn hơn đối với các lỗi làm tròn đối với các số gần bằng 0.

Nhưng sự xa xỉ của việc sử dụng cách biểu diễn các số không chuẩn hóa trong bộ xử lý không phải là miễn phí. Bởi vì những con số như vậy cần được xử lý khác nhau trong tất cả các phép tính số học nên rất khó để làm cho số học đó hoạt động hiệu quả. Điều này gây thêm khó khăn khi triển khai ALU trong bộ xử lý. Và mặc dù các số không chuẩn hóa rất hữu ích nhưng chúng không phải là thuốc chữa bách bệnh và việc làm tròn về 0 vẫn cần được quan tâm. Do đó, chức năng này đã trở thành trở ngại trong quá trình phát triển tiêu chuẩn và gặp phải sự phản kháng mạnh mẽ nhất.

3.4 Thứ tự số trong IEEE754
Một trong những tính năng tuyệt vời của cách biểu diễn số IEEE754 là số mũ và phần định trị được sắp xếp lần lượt theo cách mà chúng cùng nhau tạo thành một chuỗi các số nguyên (n) thỏa mãn các giá trị sau:

N

Vì vậy, nếu chúng ta lấy một số dấu phẩy động dương, chuyển nó thành số nguyên, thêm "1", chúng ta sẽ nhận được số tiếp theo có thể biểu thị trong số học này. Trong C bạn có thể làm như thế này:

Nổi a=0,5; int n = *((int*) &a); float b = *((float*) &(++n)); printf("Sau %e số sau: %e, hiệu (%e)\n", a, b, b-a);
Mã này sẽ chỉ hoạt động trên kiến ​​trúc int 32 bit.

4. Cạm bẫy trong phép tính dấu phẩy động

Bây giờ - để thực hành. Chúng ta hãy xem xét các tính năng của số học dấu phẩy động cần được chăm sóc đặc biệt khi lập trình.
4.1 Làm tròn
Các lỗi do làm tròn số rất khó gặp trong số học dấu phẩy động hiện đại, đặc biệt khi sử dụng độ chính xác kép. Quy tắc làm tròn trong tiêu chuẩn IEEE754 nêu rõ rằng kết quả của bất kỳ phép tính số học nào phải như thể nó được thực hiện trên các giá trị chính xác và được làm tròn đến số gần nhất có thể biểu thị ở định dạng đó. Điều này đòi hỏi nỗ lực bổ sung từ ALU và một số tùy chọn trình biên dịch (chẳng hạn như "-ffast-math" trong gcc) có thể vô hiệu hóa hành vi này. Các tính năng làm tròn của IEEE754:
  • Làm tròn đến số gần nhất trong tiêu chuẩn được thực hiện khác với cách chúng ta thường làm. Về mặt toán học, người ta đã chứng minh rằng nếu 0,5 được làm tròn thành 1 (lên), thì sẽ có một tập hợp các phép toán trong đó sai số làm tròn sẽ tăng lên vô cùng. Vì vậy, IEEE754 sử dụng quy tắc làm tròn thành chẵn. Vì vậy, 12,5 sẽ được làm tròn thành 12 và 13,5 sẽ được làm tròn thành 14.
  • Hoạt động nguy hiểm nhất khi làm tròn số học dấu phẩy động là phép trừ. Khi trừ các số gần nhau, các chữ số có nghĩa có thể bị mất, điều này
    có thể tăng sai số tương đối lên nhiều lần.
  • Đối với nhiều công thức toán học được sử dụng rộng rãi, các nhà toán học đã phát triển một dạng đặc biệt có thể giảm đáng kể sai số làm tròn. Ví dụ: tốt hơn nên tính công thức “x 2 -y 2” bằng công thức “(x-y)(x+y)”.
4.2 Tính không kết hợp của các phép tính số học
Trong số học dấu phẩy động, quy tắc (a*b)*c = a*(b*c) không đúng cho bất kỳ phép toán số học nào. Ví dụ,

(10 20 +1)-10 20 =0 ≠ (10 20 -10 20)+1=1

Giả sử chúng ta có một chương trình tính tổng các số.

Đôi s = 0,0; vì (int i=0; tôi Một số trình biên dịch có thể mặc định viết lại mã để sử dụng nhiều ALU cùng một lúc (giả sử n chia hết cho 2):

đôi sa, s; sa=sa=0,0; vì (int i=0; tôi Vì các phép tính tổng không liên kết nên hai chương trình có thể tạo ra các kết quả khác nhau.

4.3 Hằng số
Hãy nhớ rằng không phải tất cả các số thập phân đều có biểu diễn dấu phẩy động nhị phân. Ví dụ: số "0,2" sẽ được biểu thị là "0,200000003" ở độ chính xác đơn. Theo đó, “0,2 + 0,2 ≈ 0,4.” Sai số tuyệt đối ở cá nhân
Trong trường hợp này, nó có thể không cao, nhưng nếu chúng ta sử dụng hằng số như vậy trong một vòng lặp, chúng ta có thể mắc sai số tích lũy.
4.4 Chọn tối thiểu hai giá trị
Giả sử chúng ta cần chọn tối thiểu hai giá trị. Trong C, điều này có thể được thực hiện theo một trong những cách sau:
  1. x< y? x: y
  2. x<= y? x: y
  3. x > y? y: x
  4. x >= y? y: x
Thông thường trình biên dịch coi chúng tương đương và luôn sử dụng tùy chọn đầu tiên vì nó được thực thi trong một lệnh của bộ xử lý. Nhưng nếu chúng ta tính đến ±0 và NaN, thì các thao tác này không hề tương đương nhau:
x y x< y? x: y x<= y? x: y x > y? y: x x >= y? y: x
+0 -0 -0 +0 +0 -0
NaN 1 1 1 NaN NaN
4.5 So sánh các số
Một lỗi rất phổ biến khi làm việc với float xảy ra khi kiểm tra sự bằng nhau. Ví dụ,

Giá trị nổi fValue = 0,2; if (fValue == 0,2) DoStuff();
Lỗi ở đây, thứ nhất là 0,2 không có biểu diễn nhị phân chính xác và thứ hai, 0,2 là hằng số có độ chính xác kép và biến fValue là đơn và không có gì đảm bảo về hành vi của phép so sánh này.

Cách tốt nhất nhưng vẫn sai sót là so sánh sự khác biệt với sai số tuyệt đối cho phép:

Nếu (fabs(fValue – fExpected)< 0.0001) DoStuff(); // fValue=fExpected?

Nhược điểm của phương pháp này là sai số trong việc biểu diễn một số tăng lên khi chính số đó tăng lên. Vì vậy, nếu chương trình mong đợi "10000" thì đẳng thức trên sẽ không đúng với số lân cận gần nhất (10000.000977). Điều này đặc biệt đúng nếu chương trình có chuyển đổi từ độ chính xác đơn sang độ chính xác kép.

Việc lựa chọn quy trình so sánh phù hợp là điều khó khăn và tôi giới thiệu những độc giả quan tâm đến bài viết của Bruce Dawson. Nó đề xuất so sánh các số dấu phẩy động bằng cách chuyển đổi chúng thành một biến số nguyên. Đây là cách tốt nhất, mặc dù không thể mang theo được:

Bool MostEqual2sComplement(float A, float B, int maxUlps) ( // maxUlps không được âm và không quá lớn để // NaN không bằng bất kỳ số nào khẳng định(maxUlps > 0 && maxUlps< 4 * 1024 * 1024); int aInt = *(int*)&A; // Уберем знак в aInt, если есть, чтобы получить правильно упорядоченную последовательность if (aInt < 0) aInt = 0x80000000 - aInt; //aInt &= 0x7fffffff; //(см. комментарий пользователя Vayun) // Аналогично для bInt int bInt = *(int*)&B; if (bInt < 0) bInt = 0x80000000 - bInt; /*aInt &= 0x7fffffff;*/ unsigned int intDiff = abs(aInt - bInt); /*(см. комментарий пользователя Vayun)*/ if (intDiff <= maxUlps) return true; return false; }

Trong chương trình này, maxUlps (từ Đơn vị ở vị trí cuối cùng) là số lượng số dấu phẩy động tối đa có thể nằm giữa giá trị đang được kiểm tra và giá trị mong đợi. Một ý nghĩa khác của biến này là số chữ số nhị phân (bắt đầu bằng số ít quan trọng nhất) trong các số được so sánh được phép bỏ qua. Ví dụ: maxUlps=16 có nghĩa là 4 bit thấp hơn (log 2 16) có thể không khớp, nhưng các số vẫn được coi là bằng nhau. Trong trường hợp này, khi so sánh với số 10000, sai số tuyệt đối sẽ bằng 0,0146 và khi so sánh với 0,001, sai số sẽ nhỏ hơn 0,00000001 (10 -8).

5. Kiểm tra tính đầy đủ của hỗ trợ IEE754

Bạn có nghĩ rằng nếu bộ xử lý tuân thủ đầy đủ tiêu chuẩn IEEE754 thì bất kỳ chương trình nào sử dụng kiểu dữ liệu tiêu chuẩn (chẳng hạn như float/double trong C) sẽ tạo ra kết quả tương tự trên các máy tính khác nhau không? Bạn sai rồi. Tính di động và việc tuân thủ tiêu chuẩn bị ảnh hưởng bởi các tùy chọn trình biên dịch và tối ưu hóa. William Kahan đã viết một chương trình bằng C (cũng có một phiên bản dành cho Fortran) cho phép bạn kiểm tra xem tổ hợp “kiến trúc + trình biên dịch + tùy chọn” có đáp ứng IEEE754 hay không. Nó được gọi là “hoang tưởng dấu phẩy động” và văn bản nguồn của nó có sẵn để tải xuống. Một chương trình tương tự có sẵn cho GPU. Ví dụ: Trình biên dịch Intel (icc) sử dụng mô hình IEEE754 "thoải mái" theo mặc định và kết quả là không phải tất cả các thử nghiệm đều chạy. Tùy chọn "-fp-model chính xác" cho phép bạn biên dịch chương trình một cách chính xác theo tiêu chuẩn. Trình biên dịch GCC có tùy chọn "-ffast-math" gây ra sự không tuân thủ IEEE754.

Phần kết luận

Cuối cùng là một câu chuyện mang tính hướng dẫn. Khi tôi đang thực hiện một dự án thử nghiệm trên GPU, tôi đã có phiên bản nối tiếp và song song của cùng một chương trình. Sau khi so sánh thời gian thực hiện, tôi rất vui vì đã tăng tốc gấp 300 lần. Nhưng sau đó, hóa ra các phép tính trên GPU đã “đổ vỡ” và chuyển sang NaN, và làm việc với chúng trong GPU nhanh hơn so với các con số thông thường. Một điều thú vị khác - cùng một chương trình trên trình mô phỏng GPU (trên CPU) đã tạo ra kết quả chính xác, nhưng trên chính GPU thì không. Sau đó hóa ra vấn đề là GPU này không hỗ trợ đầy đủ tiêu chuẩn IEEE754 và cách tiếp cận trực tiếp không hiệu quả.

Số học dấu phẩy động bây giờ gần như hoàn hảo. Hầu như luôn luôn, một cách tiếp cận ngây thơ sẽ hiệu quả và một chương trình không tính đến tất cả các tính năng của nó sẽ tạo ra kết quả chính xác và những cạm bẫy được mô tả chỉ liên quan đến các trường hợp kỳ lạ. Nhưng bạn phải luôn cảnh giác: trong một vấn đề như toán học máy tính, rất dễ dẫm phải một cái cào.
! Thêm thẻ

Hướng dẫn

Nếu ở hình thức phân số chúng ta cần tưởng tượng toàn bộ con số, sau đó sử dụng một làm mẫu số và đặt giá trị ban đầu vào tử số. Dạng ký hiệu này được gọi là phân số thông thường không chính xác, vì mô đun của tử số của nó lớn hơn mô đun của mẫu số. Ví dụ, con số 74 có thể viết là 74/1, và con số-12 - như -12/1. Nếu cần, bạn có thể tử số và mẫu số cùng một số lần - giá trị phân số trong trường hợp này nó vẫn khớp với số ban đầu. Ví dụ: 74=74/1=222/3 hoặc -12=-12/1=-84/7.

Nếu bản gốc con số trình bày dưới dạng thập phân phân số, sau đó giữ nguyên toàn bộ phần và thay thế dấu phẩy ngăn cách bằng dấu cách. Đặt phần phân số vào tử số và làm mẫu số, sử dụng số mười lũy thừa có số mũ bằng số chữ số trong phân số của số ban đầu. Phần phân số thu được có thể rút gọn bằng cách chia tử số và mẫu số cho cùng con số. Ví dụ: số thập phân phân số 7,625 sẽ tương ứng với phân số chung 7 625/1000, sau khi rút gọn sẽ lấy giá trị 7 5/8. Dạng ký hiệu này phổ biến phân số Trộn. Nếu cần, có thể rút gọn về dạng thông thường sai bằng cách nhân phần nguyên với mẫu số rồi cộng kết quả vào tử số: 7,625 = 7,625/1000 = 7 5/8 = 61/8.

Nếu phân số thập phân ban đầu cũng là phân số tuần hoàn thì hãy sử dụng hệ phương trình để tính giá trị tương đương của nó ở định dạng chẳng hạn. phân số bình thường. Giả sử, nếu phân số ban đầu là 3,5(3), thì chúng ta có thể có đẳng thức: 100*x-10*x=100*3.5(3)-10*3.5(3). Từ đó chúng ta có thể suy ra đẳng thức 90*x=318, và phân số mong muốn sẽ bằng 318/90, sau khi rút gọn sẽ cho phân số thông thường 3 24/45.

Nguồn:

  • Số 450.000 có thể được biểu diễn dưới dạng tích của 2 số không?

Trong cuộc sống hàng ngày, các số không tự nhiên thường gặp nhất: 1, 2, 3, 4, v.v. (5 kg khoai tây) và các số phân số, không nguyên (5,4 kg hành). Hầu hết chúng được trình bày trong hình thức Phân số thập phân. Nhưng biểu thị phần thập phân trong hình thức phân sốđủ đơn giản.

Hướng dẫn

Ví dụ: số "0,12" được đưa ra. Nếu không phải là phân số này và hãy tưởng tượng nó như thế này thì nó sẽ trông như thế này: 12/100 (“mười hai”). Để loại bỏ một trăm trong , bạn cần chia cả tử số và mẫu số cho số chia hết các số của chúng. Số này là 4. Sau đó chia tử số và mẫu số, chúng ta được số: 3/25.

Nếu chúng ta xem xét một sản phẩm hàng ngày hơn, thì trên thẻ giá thường ghi rõ trọng lượng của nó, chẳng hạn như 0,478 kg hoặc hơn. Con số này cũng dễ hình dung trong hình thức phân số:
478/1000 = 239/500. Phân số này khá xấu và nếu có thể thì phân số thập phân này có thể được rút gọn hơn nữa. Và tất cả đều sử dụng cùng một phương pháp: chọn một số chia hết cả tử số và mẫu số. Số này có ước chung lớn nhất. Hệ số này là “lớn nhất” vì việc chia ngay cả tử số và mẫu số cho 4 (như trong ví dụ đầu tiên) sẽ thuận tiện hơn nhiều so với chia hai lần cho 2.

Video về chủ đề

Số thập phân phân số- đa dạng phân số, có số “làm tròn” ở mẫu số: 10, 100, 1000, v.v., Ví dụ: phân số 5/10 có ký hiệu thập phân là 0,5. Dựa trên nguyên tắc này, phân số có thể được đại diện trong hình thức số thập phân phân số.

Hướng dẫn

Chúng ta đang sống trong một thế giới kỹ thuật số. Nếu trước đây giá trị chủ yếu là đất đai, tiền bạc hay tư liệu sản xuất thì nay công nghệ và thông tin quyết định tất cả. Mọi người muốn thành công chỉ cần có nghĩa vụ phải hiểu bất kỳ con số nào, bất kể chúng được trình bày dưới dạng nào. Ngoài dạng ký hiệu thập phân thông thường, còn có nhiều cách thuận tiện khác để biểu diễn số (trong ngữ cảnh của các nhiệm vụ cụ thể). Chúng ta hãy nhìn vào phổ biến nhất trong số họ.

Bạn sẽ cần

  • Máy tính

Hướng dẫn

Để biểu diễn một số thập phân dưới dạng phân số, trước tiên bạn cần xem đó là số thực hay số thực. Trọn con số hoàn toàn không có dấu phẩy hoặc có số 0 sau dấu phẩy (hoặc nhiều số 0, giống nhau). Nếu có một số số sau dấu thập phân thì đây con sốđề cập đến những cái thực sự. Trọn con số rất dễ biểu diễn dưới dạng phân số: chính tử số sẽ chuyển thành con số, và mẫu số là . Với số thập phân thì gần như giống nhau, chỉ có điều chúng ta sẽ nhân cả hai vế của phân số với mười cho đến khi bỏ dấu phẩy ở tử số.

| Lập kế hoạch bài học cho năm học (FSES) | § 1.2. Biểu diễn số trong máy tính

Bài học 6 - 7
§ 1.2. Biểu diễn số trong máy tính

Từ khóa:

Phóng điện
biểu diễn số nguyên không dấu
biểu diễn số nguyên có dấu
biểu diễn số thực

1.2.1. Biểu diễn số nguyên

RAM của máy tính bao gồm các ô, mỗi ô là một hệ thống vật lý bao gồm một số phần tử đồng nhất nhất định. Các phần tử này có hai trạng thái ổn định, một trạng thái tương ứng với 0 và trạng thái còn lại tương ứng với một. Mỗi phần tử như vậy được sử dụng để lưu trữ một trong các bit - một chữ số của số nhị phân. Đó là lý do tại sao mỗi phần tử ô được gọi là bit hoặc chữ số (Hình 1.2).

Cơm. 1.2. Ô nhớ

Để biểu diễn số nguyên trên máy tính, một số phương pháp khác nhau được sử dụng, khác nhau về số chữ số (các số nguyên thường được phân bổ 8, 16, 32 hoặc 64 chữ số) và sự hiện diện hay vắng mặt của chữ số dấu. Biểu diễn không dấu chỉ có thể được sử dụng cho số nguyên không âm; số âm chỉ có thể được biểu diễn ở dạng có dấu.

Biểu diễn không dấu được sử dụng cho các đối tượng như địa chỉ ô, các bộ đếm khác nhau (ví dụ: số ký tự trong văn bản), cũng như các số biểu thị ngày và giờ, kích thước pixel của hình ảnh đồ họa, v.v.

Giá trị tối đa của số nguyên không âm đạt được khi tất cả các bit của ô đều chứa số nguyên. Đối với biểu diễn n-bit, nó sẽ bằng 2 n -1. Số tối thiểu tương ứng với n số 0 được lưu trong n bit bộ nhớ và bằng 0.

Sau đây là các giá trị tối đa cho số nguyên n-bit không dấu:

Để có được biểu diễn máy tính của một số nguyên không dấu, chỉ cần chuyển đổi số đó sang hệ thống số nhị phân và đệm kết quả thu được ở bên trái bằng các số 0 thành dung lượng chữ số tiêu chuẩn.

ví dụ 1. Số 53 10 = 110101 2 được biểu diễn bằng tám chữ số có dạng:

Cùng một số 53 có mười sáu chữ số sẽ được viết như sau:

Khi biểu thị bằng dấu, chữ số có nghĩa nhất (trái) được gán cho dấu của số, các chữ số còn lại được gán cho chính số đó. Nếu số dương thì 0 được đặt trong bit dấu, nếu số âm - 1. Cách biểu diễn số này được gọi là mã trực tiếp.

Trong máy tính, mã trực tiếp được sử dụng để lưu trữ số dương trong thiết bị lưu trữ nhằm thực hiện các phép tính trên số dương.

Trang web của Trung tâm Tài nguyên Thông tin và Giáo dục Liên bang (http://fcior.edu.ru/) có mô-đun thông tin “Số và mã máy tính của nó”. Với tài nguyên này, bạn có thể có thêm thông tin về chủ đề bạn đang nghiên cứu.

Để thực hiện các phép tính trên số âm, mã bổ sung được sử dụng để thay thế phép trừ bằng phép cộng. Bạn có thể tìm hiểu thuật toán tạo mã bổ sung bằng cách sử dụng mô-đun thông tin “Mã bổ sung” trên trang web của Trung tâm Tài nguyên Giáo dục và Thông tin Liên bang (http://fcior.edu.ru/).

1.2.2. Biểu diễn số thực

Mọi số thực A đều có thể viết dưới dạng hàm mũ:

Ở đâu:

m - phần định trị của số;

p - thứ tự số.

Ví dụ: số 472 LLC LLC có thể được biểu diễn như sau: 4,72 10 8, 47,2 10 7, 472,0 10 6, v.v.

Bạn có thể đã gặp dạng viết số mũ khi thực hiện các phép tính bằng máy tính, khi bạn nhận được các mục có dạng sau dưới dạng câu trả lời: 4,72E+8.

Ở đây, ký hiệu “E” biểu thị cơ số của hệ thống số thập phân và được đọc là “nhân lũy thừa mười”.

Từ ví dụ trên, bạn có thể thấy rằng vị trí của dấu thập phân trong một số có thể thay đổi.

Để thống nhất, phần định trị thường được viết dưới dạng phân số thích hợp với chữ số khác 0 sau dấu thập phân. Trong trường hợp này, số 472 LLC LLC sẽ được biểu thị là 0,472 10 9.

Một số thực có thể chiếm 32 hoặc 64 bit trong bộ nhớ máy tính. Trong trường hợp này, các bit được phân bổ để lưu trữ dấu mantissa, dấu thứ tự, thứ tự và mantissa.

Ví dụ:

Phạm vi biểu diễn số thực được xác định bởi số bit được phân bổ để lưu trữ thứ tự của số và độ chính xác được xác định bởi số bit được phân bổ để lưu trữ phần định trị.

Giá trị lớn nhất của thứ tự số trong ví dụ trên là 1111111 2 = 127 10, và do đó giá trị lớn nhất của số đó là:

0,11111111111111111111111 10 1111111

Hãy cố gắng tự mình tìm ra giá trị thập phân tương đương của giá trị này là bao nhiêu.

Một loạt các cách biểu diễn số thực rất quan trọng để giải các bài toán khoa học và kỹ thuật. Đồng thời, cần hiểu rằng các thuật toán xử lý các số như vậy tốn nhiều công sức hơn so với các thuật toán xử lý số nguyên.

ĐIỀU QUAN TRỌNG NHẤT

Để biểu diễn số nguyên trên máy tính, một số phương pháp khác nhau được sử dụng, khác nhau về số chữ số (8, 16, 32 hoặc 64) và sự hiện diện hay vắng mặt của chữ số dấu.

Để biểu thị một số nguyên không dấu, nó phải được chuyển đổi sang hệ thống số nhị phân và kết quả thu được phải được đệm ở bên trái bằng các số 0 thành dung lượng tiêu chuẩn.

Khi biểu diễn bằng dấu, chữ số có nghĩa lớn nhất được gán cho dấu của số đó, các chữ số còn lại được gán cho chính số đó. Nếu số dương thì 0 được đặt trong bit dấu, nếu số âm thì 1. Số dương được lưu trong máy tính dưới dạng mã trực tiếp, số âm được lưu trong mã bổ sung.

Khi lưu trữ số thực trong máy tính, các bit được phân bổ để lưu trữ dấu thứ tự của số, chính thứ tự đó, dấu hiệu của phần định trị và phần định trị. Trong trường hợp này, bất kỳ số nào cũng được viết như sau:

Ở đâu:

m - phần định trị của số;
q - cơ số của hệ đếm;
p - thứ tự số.

Câu hỏi và nhiệm vụ

1. Đọc tài liệu trình bày cho đoạn văn có trong phần phụ lục điện tử của sách giáo khoa. Sử dụng những tài liệu này khi chuẩn bị câu trả lời cho các câu hỏi và hoàn thành bài tập.

2. Số nguyên dương và số nguyên âm được biểu diễn trong bộ nhớ máy tính như thế nào?

3. Bất kỳ số nguyên nào cũng có thể được coi là số thực, nhưng có phần phân số bằng 0. Chứng minh tính khả thi của việc có những cách đặc biệt để biểu diễn số nguyên trên máy tính.

4. Biểu thị số 63 10 ở định dạng 8 bit không dấu.

5. Tìm số thập phân tương đương của các số bằng cách sử dụng mã trực tiếp của chúng, được viết ở định dạng 8 bit có dấu:

a) 01001100;
b) 00010101.

6. Số nào trong số 443 8, 101010 2, 256 10 có thể được lưu trữ ở định dạng 8 bit?

7. Viết các số sau ở dạng tự nhiên:

a) 0,3800456 10 2;
b) 0,245 10 -3;
c) 1.256900E+5;
d) 9.569120E-3.

8. Viết số 2010.0102 10 theo năm cách khác nhau dưới dạng hàm mũ.

9. Viết các số sau dưới dạng hàm mũ với phần định trị đã chuẩn hóa - một phân số thích hợp có chữ số khác 0 sau dấu thập phân:

a) 217.934 10;
b) 75321 10;
c) 0,00101 10.

10. Vẽ sơ đồ kết nối các khái niệm cơ bản được thảo luận trong đoạn này.

Dữ liệu số được xử lý trong máy tính sử dụng hệ thống số nhị phân. Các số được lưu trữ trong bộ nhớ máy tính ở dạng mã nhị phân, nghĩa là dưới dạng một chuỗi các số 0 và số 1, và có thể được biểu diễn ở định dạng dấu phẩy động hoặc cố định.

Các số nguyên được lưu trữ trong bộ nhớ ở định dạng điểm cố định. Với định dạng biểu diễn số này, một thanh ghi bộ nhớ gồm 8 ô nhớ (8 bit) được phân bổ để lưu trữ các số nguyên không âm. Mỗi chữ số của ô nhớ luôn tương ứng với cùng một chữ số của số đó và dấu phẩy nằm ở bên phải sau chữ số có nghĩa nhỏ nhất và nằm ngoài lưới bit. Ví dụ: số 110011012 sẽ được lưu trong thanh ghi bộ nhớ như sau:

Bảng 4

Giá trị tối đa của số nguyên không âm có thể được lưu trong thanh ghi ở định dạng điểm cố định có thể được xác định từ công thức: 2n – 1, trong đó n là số chữ số của số đó. Số tối đa sẽ bằng 28 - 1 = 25510 = 111111112 và số tối thiểu 010 = 000000002. Do đó, phạm vi thay đổi của các số nguyên không âm sẽ là từ 0 đến 25510.

Không giống như hệ thập phân, hệ nhị phân trong biểu diễn số nhị phân trên máy tính không có các ký hiệu biểu thị dấu của số: dương (+) hoặc âm (-), do đó, để biểu diễn các số nguyên có dấu trong hệ nhị phân, hai Các định dạng biểu diễn số được sử dụng: định dạng giá trị số có dấu và định dạng phần bù hai. Trong trường hợp đầu tiên, hai thanh ghi bộ nhớ (16 bit) được phân bổ để lưu trữ số nguyên có dấu và chữ số có nghĩa nhất (ngoài cùng bên trái) được sử dụng làm dấu của số: nếu số dương thì 0 được ghi vào bit dấu , nếu số âm thì 1. Ví dụ: số 53610 = 00000010000110002 sẽ được biểu thị trong các thanh ghi bộ nhớ dưới dạng sau:

Bảng 5

và số âm -53610 = 10000010000110002 ở dạng:

Bảng 6

Số dương tối đa hoặc số âm tối thiểu ở định dạng giá trị số có dấu (có tính đến cách biểu thị một chữ số trên mỗi dấu) là 2n-1 – 1 = 216-1 – 1 = 215 – 1 = 3276710 = 11111111111111112 và phạm vi số sẽ từ - 3276710 đến 32767.

Thông thường, để biểu diễn các số nguyên có dấu trong hệ nhị phân, định dạng mã bù hai được sử dụng, cho phép bạn thay thế phép toán trừ số học trong máy tính bằng phép toán cộng, giúp đơn giản hóa đáng kể cấu trúc của bộ vi xử lý và tăng hiệu suất của nó .

Để biểu diễn số nguyên âm ở định dạng này, mã bù hai được sử dụng, là mô đun của số âm bằng 0. Việc chuyển đổi một số nguyên âm thành phần bù hai được thực hiện bằng các thao tác sau:


1) viết mô-đun số bằng mã trực tiếp bằng n (n = 16) chữ số nhị phân;

2) lấy mã ngược của số (đảo ngược tất cả các chữ số của số, tức là thay thế tất cả các số bằng số 0 và thay thế số 0 bằng số 1);

3) thêm một vào chữ số có nghĩa nhỏ nhất vào mã ngược thu được.

Ví dụ: đối với số -53610 ở định dạng này, mô-đun sẽ là 00000010000110002, mã đối ứng sẽ là 1111110111100111 và mã bổ sung sẽ là 1111110111101000.

Cần phải nhớ rằng phần bù của một số dương chính là số đó.

Để lưu trữ các số nguyên có dấu khác với biểu diễn máy tính 16 bit khi sử dụng hai thanh ghi bộ nhớ(định dạng số này còn được gọi là định dạng số nguyên có dấu ngắn), định dạng số nguyên có dấu trung bình và dài được sử dụng. Để biểu diễn các số ở định dạng số ở giữa, bốn thanh ghi được sử dụng (4 x 8 = 32 bit) và để biểu diễn các số ở định dạng số dài, tám thanh ghi được sử dụng (8 x 8 = 64 bit). Phạm vi giá trị cho định dạng số trung bình và dài sẽ lần lượt là: -(231 – 1) ... + 231 – 1 và -(263-1) … + 263 – 1.

Việc biểu diễn số trên máy tính ở định dạng điểm cố định có những ưu điểm và nhược điểm. ĐẾN những lợi ích bao gồm sự đơn giản trong việc biểu diễn các số và các thuật toán để thực hiện các phép tính số học; nhược điểm là phạm vi biểu diễn số hữu hạn, có thể không đủ để giải quyết nhiều vấn đề có tính chất thực tiễn (toán học, kinh tế, vật lý, v.v.).

Số thực (số thập phân hữu hạn và vô hạn) được xử lý và lưu trữ trong máy tính ở định dạng dấu phẩy động. Với định dạng biểu diễn số này, vị trí của dấu thập phân trong mục nhập có thể thay đổi. Bất kỳ số thực K nào ở định dạng dấu phẩy động đều có thể được biểu diễn dưới dạng:

trong đó A là phần định trị của số; h - cơ số của hệ đếm; p – thứ tự số.

Biểu thức (2.7) của hệ số thập phân sẽ có dạng:

cho nhị phân -

cho bát phân -

cho hệ thập lục phân -

Dạng biểu diễn số này còn được gọi là Bình thường . Với sự thay đổi về thứ tự, dấu phẩy trong số sẽ dịch chuyển, nghĩa là nó dường như nổi sang trái hoặc sang phải. Vì vậy, dạng biểu diễn số thông thường được gọi là dạng dấu phẩy động. Ví dụ: số thập phân 15,5 ở định dạng dấu phẩy động có thể được biểu diễn dưới dạng: 0,155 102; 1,55 101; 15,5 100; 155,0 10-1; 1550.0 · 10-2, v.v. Dạng ký hiệu dấu phẩy động thập phân 15.5 này không được sử dụng khi viết chương trình máy tính và nhập chúng vào máy tính (các thiết bị đầu vào của máy tính chỉ chấp nhận ghi dữ liệu tuyến tính). Dựa vào đó, biểu thức (2.7) biểu diễn số thập phân và nhập vào máy tính được chuyển về dạng

trong đó P là thứ tự của số,

tức là thay vì cơ số của hệ thống số 10, họ viết chữ E, thay vì dấu phẩy, dấu chấm và không đặt dấu nhân. Như vậy, số 15,5 ở dạng dấu phẩy động và dạng tuyến tính (biểu diễn trên máy tính) sẽ được viết là: 0,155E2; 1,55E1; 15,5E0; 155.0E-1; 1550.0E-2, v.v.

Bất kể hệ thống số nào, bất kỳ số nào ở dạng dấu phẩy động đều có thể được biểu diễn bằng vô số số. Hình thức ghi này được gọi là không chuẩn hóa . Để biểu diễn rõ ràng các số dấu phẩy động, một dạng viết số chuẩn hóa được sử dụng, trong đó phần định trị của số phải đáp ứng điều kiện

ở đâu |A| - giá trị tuyệt đối của phần định trị của số.

Điều kiện (2.9) có nghĩa là phần định trị phải là một phân số thích hợp và có chữ số khác 0 sau dấu thập phân, hay nói cách khác, nếu phần định trị không có số 0 sau dấu thập phân thì số đó được gọi là chuẩn hóa . Vì vậy, số 15,5 ở dạng chuẩn hóa (mantissa chuẩn hóa) ở dạng dấu phẩy động sẽ trông như thế này: 0,155 102, tức là mantissa chuẩn hóa sẽ là A = 0,155 và thứ tự P = 2, hoặc trong biểu diễn máy tính của số 0,155E2 .

Số dấu phẩy động có định dạng cố định và chiếm bốn (32 bit) hoặc tám byte (64 bit) bộ nhớ máy tính. Nếu một số chiếm 32 bit trong bộ nhớ của máy tính thì đó là số có độ chính xác thông thường; nếu là 64 bit thì đó là số có độ chính xác kép. Khi viết một số dấu phẩy động, các bit được phân bổ để lưu dấu của phần định trị, dấu của số mũ, phần định trị và số mũ. Số chữ số được phân bổ theo thứ tự của số xác định phạm vi biến thể của các số và số chữ số được phân bổ để lưu trữ phần định trị xác định độ chính xác mà số được chỉ định.

Khi thực hiện các phép tính số học (cộng và trừ) trên các số được trình bày ở định dạng dấu phẩy động, quy trình (thuật toán) sau đây được triển khai:

1) thứ tự của các số thực hiện các phép tính số học được căn chỉnh (thứ tự của số tuyệt đối nhỏ hơn tăng theo thứ tự của số tuyệt đối lớn hơn, trong khi phần định trị giảm cùng một lượng);

2) các phép tính số học được thực hiện trên lớp số;

3) kết quả thu được được chuẩn hóa.

Phần thực hành