кр гаряев. Чарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе. Книга принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании
Скачать 6.11 Mb.
|
Число битов Диапазон целых положительных чисел Диапазон целых отрицательных чисел 8 От 0 до 255 От –128 до 127 16 От 0 до 65 535 От –32 768 до 32 767 32 От 0 до 4 294 967 295 От –2 147 483 648 до 2 147 483 647 Однако на этом мы и остановились. Помимо целых чисел математики так- же различают рациональные числа, которые могут быть представлены в каче- стве отношения двух целых чисел. Это отношение также называется дробью. 388 Код Например, дробь ¾ — рациональное число, отношение чисел 3 и 4. Это число также можно записать в виде десятичной дроби: 0,75. Десятичная дробь оста- ется отношением двух чисел, в данном случае 75/100. В главе 7 рассказывалось, что в десятичной системе счисления цифры сле- ва от десятичного разделителя являются множителями целых положительных степеней числа 10, а цифры справа — множителями целых отрицательных степеней числа 10. В одном из примеров я показал, что число 42 705,684 равно: 4 × 10 000 + 2 × 1000 + 7 × 100 + 0 × 10 + 5 × 1 + 6 : 10 + 8 : 100 + 4 : 1000. Обратите внимание на знаки деления. Затем я представил эту последова- тельность операций без деления: 4 × 10 000 + 2 × 1000 + 7 × 100 + 0 × 10 + 5 × 1 + 6 × 0,1 + 8 × 0,01 + 4 × 0,001. И наконец, отобразил это число, используя степени числа 10: 4 × 10 4 + 2 × 10 3 + 7 × 10 2 + 0 × 10 1 + 5 × 10 0 + 6 × 10 –1 + 8 × 10 –2 + 4 × 10 –3 Глава 23. Фиксированная точка, плавающая точка 389 Существуют рациональные числа, которые не так легко представить в виде десятичной дроби, например ⅓. Если вы разделите 1 на 3, то получите следующее. 0,33333333333333333333333333333333333333333333333333333… И так до бесконечности. Подобная дробь называется периодической и за- писывается 0,(3). Несмотря на то что запись числа ⅓ в виде десятичной дро- би выглядит неуклюже, это число по-прежнему является рациональным, по- скольку это отношение двух целых чисел. Вот еще один пример: отношение 1 / 7 можно записать в виде десятичной дроби. 0,1428571428571428571428571428571428571428571428571428571… Или 0,142857. Иррациональные числа — это числа, которые нельзя выразить в виде от- ношения двух целых чисел, значит, десятичная дробь продолжается бесконеч- но без повторяющихся последовательностей цифр. К числам такого типа от- носится квадратный корень из 2. √2 ≈ 1,41421356237309504880168872420969807856967187537695… Квадратный корень из 2 — решение следующего алгебраического уравнения: x 2 – 2 = 0. Если число не является решением какого-либо алгебраического уравне- ния с целочисленными коэффициентами, оно называется трансцендентным. (Все трансцендентные числа иррациональны, однако не все иррациональные числа трансцендентны.) К трансцендентным числам относится число π, пред- ставляющее отношение длины окружности к ее диаметру и приблизительно равное следующему. 3,1415926535897932846264338327950288419716939937511… Еще одним трансцендентным числом является e, к которому стремится выражение: (1 + 1n) n 390 Код при n, стремящемся к бесконечности. Данное число приблизительно равно следующему. 2,71828182845904523536028747135266249775724709369996… Все числа, о которых мы говорили, то есть рациональные и иррациональ- ные, называются действительными, или вещественными. Это обозначение отличает их от мнимых — квадратных корней из отрицательных чисел. Комп- лексные числа — это комбинации мнимых и вещественных чисел. Несмотря на свое название, мнимые числа существуют и используются, например при решении некоторых сложных задач по электронике. Мы привыкли считать, что числовой ряд непрерывен. Если вы дадите два рациональных числа, я определю, какое число находится между ними. Для это- го достаточно найти их среднее арифметическое. Однако цифровые компьюте- ры не могут работать с континуумами. Биты могут быть равны либо 0, либо 1, меж ду которыми нет больше никаких значений. Так что цифровые компьютеры могут иметь дело только с дискретными значениями. Количество дискретных значений, которые вы можете представить, напрямую связано с количеством доступных битов. Например, в ячейках емкостью 32 бита можно хранить поло- жительные целые числа в диапазоне от 0 до 4 294 967 295. При необходимости сохранить значение 4,5 придется пересмотреть этот подход и действовать иначе. Можно ли представить дробные значения в двоичном формате? Да, мож- но. Вероятно, самый простой подход — использование двоично-десятичного кода (BCD). Как говорилось в главе 19, кодировка BCD позволяет записать десятичные числа в двоичном формате. Для кодирования каждой десятичной цифры (0, 1, 2, 3, 4, 5, 6, 7, 8 и 9) требуется четыре бита. Десятичная цифра Двоичное значение 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Глава 23. Фиксированная точка, плавающая точка 391 Формат BCD особенно полезен в компьютерных программах, которые ра- ботают с денежными суммами. Самые очевидные примеры — программы для банков и страховых компаний; многие дробные числа в них предусматривают не более двух знаков после десятичного разделителя. Как правило, для хранения двух BCD-цифр достаточно одного байта. Такая система записи иногда называется упакованным кодом ВСD. В такой кодировке не используется дополнение до двух. По этой причине в случае упакованного кода BCD для указания того, является ли число положитель- ным или отрицательным, обычно требуется дополнительный бит, называе- мый знаковым битом. Поскольку для хранения BCD-значения удобно вы- делять целое число байтов, под бит знака обычно отводится четыре или восемь бит памяти. Предположим, что сумма денег, которой должна оперировать ваша ком- пьютерная программа, никогда не превысит ±10 миллионов долларов. Другими словами, вам требуются значения от –9 999 999,99 до 9 999 999,99. Можно выде- лить по пять байт памяти для каждой сохраняемой суммы в долларах. Напри- мер, число –4 325 120,25 можно представить посредством пяти байт. 00010100 00110010 01010001 00100000 00100101 В шестнадцатеричном формате это эквивалентно следующей записи. 14h 32h 51h 20h 25h Обратите внимание: крайняя левая тетрада равна 1, то есть число явля- ется отрицательным. Это знаковый бит. Если бы число было положительным, то крайняя левая тетрада была бы равна 0. Для представления каждой цифры в числе требуется по четыре бита, а прочитать их можно непосредственно по шестнадцатеричным значениям, поскольку они совпадают с десятичными. Для представления значений в диапазоне от –9 999 999,99 до 9 999 999,99 вам понадобится шесть байт: пять байт для десяти цифр и еще целый байт для знакового бита. Такой формат записи дробных чисел называется записью с фиксирован- ной точкой, поскольку после десятичного разделителя всегда следует опреде- ленное количество цифр, в нашем примере две. Важно: данные о положении этого разделителя не хранятся вместе с числом. Программам, работающим с числами в таком формате, необходимо сообщить, где находится этот разде- литель. Вы можете создавать числа с любым количеством десятичных знаков, а также использовать их в одной и той же компьютерной программе. Однако 392 Код любая часть программы, выполняющая над числами арифметические опера- ции, должна знать, где находится десятичный разделитель. Формат с фиксированной точкой хорошо работает только в том случае, если вы уверены, что числа не превысят размеры выделенных под них яче- ек памяти, что вам не потребуется увеличивать количество десятичных зна- ков. Использование этого формата совершенно неуместно в ситуациях, когда числа могут стать слишком большими или маленькими. Предположим, вам нужно зарезервировать область памяти для хранения расстояний. Пробле- ма в том, что эти расстояния могут значительно варьироваться. Расстояние от Земли до Солнца составляет 150 000 000 000 метров, а радиус атома водоро- да — 0,00000000005 метра. Для хранения значений в формате с фиксированной точкой, принадлежащих этому диапазону, придется выделить 12 байт памяти. Возможно, мы сможем придумать более удобный способ хранения таких чисел, если вспомним, что ученые и инженеры выражают числа с помощью сис темы, называемой научной нотацией (экспоненциальная запись). Научная нотация особенно полезна для представления очень больших и очень маленьких чисел, поскольку предусматривает использование степени числа 10, следовательно, позволяет обойтись без длинных строк нулей. В на- учной нотации следующие числа записываются следующим образом. 490 000 000 000 4,9 × 10 11 0,00000000026 2,6 × 10 –10 В этих двух примерах числа 4,9 и 2,6 называются дробной частью, или мантиссой (хотя этот термин более уместен для логарифмов). Однако я буду придерживаться компьютерной терминологии, называя этот фрагмент науч- ной нотации значащей частью числа. Порядок — это степень, в которую возводится число 10. В первом приме- ре порядок равен 11, во втором — –10. Порядок показывает, на сколько мест был сдвинут десятичный разделитель в значащей части числа. Существует соглашение, по которому значащая часть числа должна при- надлежать интервалу от 1 (включительно) до 10. Несмотря на то что следую- щие числа равны, первый вариант представления является предпочтительным: 4,9 х 10 11 = 49 х 10 10 = 490 х 10 9 = 0,49 х 10 12 = 0,049 х 10 13 Такая форма научной нотации иногда называется нормализованной *. * А также экспоненциальной записью или записью с мантиссой. Прим. науч. ред. Глава 23. Фиксированная точка, плавающая точка 393 Обратите внимание: знак показателя степени говорит только о порядке числа, но не о том, является ли оно отрицательным или положительным. Вот как выражаются отрицательные числа в научной нотации: –5,8125 × 10 7 соответствует –58 125 000; –5,8125 × 10 –7 соответствует –0,00000058125. В компьютерах вместо формата с фиксированной точкой используется формат с плавающей точкой, который идеально подходит для хранения ма- лых и больших значений, поскольку основан на научной нотации. Однако при- меняемый в компьютерах формат с плавающей точкой подразумевает запись в научной нотации двоичных чисел, поэтому нам необходимо выяснить, как выглядят дробные числа в двоичном формате. Все гораздо проще, чем может показаться. В десятичной записи числа циф- ры справа от десятичного разделителя соответствуют отрицательным степеням числа 10. В двоичной записи цифры справа от двоичного разделителя (который выглядит так же, как и десятичный) соответствуют отрицательным степеням числа 2. Давайте преобразуем двоичное число в десятичное. 101,1101 1 × 4 + 0 × 2 + 1 × 1 + 1 ÷ 2 + 1 : 4 + 0 : 8 + 1 : 16 Операции деления можно заменить умножением на отрицательные сте- пени числа 2: 1 × 2 2 + 0 × 2 1 + 1 × 2 0 + 1 × 2 –1 + 1 × 2 –2 + 0 × 2 –3 + 1 × 2 –4 394 Код Отрицательные степени числа 2 можно также рассчитать путем последо- вательного деления 1 на 2: 1 × 4 + 0 × 2 + 1 × 1 + 1 × 0,5 + 1 × 0,25 + 0 × 0,125 + 1 × 0,0625. В результате этого вычисления находим, что десятичный эквивалент дво- ичного числа 101,1101 равен 5,8125. В десятичной научной нотации нормализованная значащая часть числа должна быть больше или равна 1, но меньше 10. Таким же образом в двоичной научной нотации нормализованная значащая часть числа должна быть боль- ше либо равна 1, но меньше числа 10, которое соответствует 2 в десятичной системе счисления. Выразим число в двоичной научной нотации. 101,1101 1,011101 × 2 2 Интересное следствие этого правила: слева от двоичного разделителя в нор- мализованном двоичном числе с плавающей точкой может стоять только 1. У большинства современных компьютеров и программ, использующих числа с плавающей точкой, применяется стандарт, введенный в 1985 году Инс титутом инженеров электротехники и электроники (Institute of Electrical and Electronics Engineers, IEEE) и признанный Американским националь- ным институтом стандартов (American National Standards Institute, ANSI), — ANSI/IEEE Std 754–1985, стандарт IEEE для двоичной арифметики с плавающей точкой. В кратком описании этого стандарта, занимающем всего 18 страниц, хорошо изложены основы кодирования двоичных чисел с плавающей точкой. Стандарт IEEE предусматривает два основных формата: число одинарной точности, занимающее в памяти четыре байта, и число двойной точности, занимающее восемь байт. Сначала рассмотрим число одинарной точности. Оно состоит из трех час тей: один бит отводится для знака (0 используется для положительного числа, а 1 — для отрицательного), восемь бит — для порядка, а 23 бита — для дробной значащей части числа, в которой самый младший бит — край- ний справа. Глава 23. Фиксированная точка, плавающая точка 395 1 знаковый бит (s) 8 битов порядка (e) 23 бита дробной значащей части (f) Итого 32 бита, или четыре байта. Поскольку в значащей части нормали- зованного двоичного числа с плавающей точкой слева от двоичного раздели- теля всегда стоит 1, соответствующий ей бит не включается при сохранении числа в формате IEEE. Сохраняется только 23-битная дробная часть. Несмо- тря на то что для хранения значащей части числа используется только 23 бита, считается, что точность равна 24 битам. Чуть позже мы разберемся в том, что это значит. Значение 8-битного порядка находится в диапазоне от 0 до 255. Такой по- рядок называется смещенным. Для нахождения истинного значения порядка с учетом знака необходимо вычесть из него число, называемое смещением. Для чисел одинарной точности с плавающей точкой смещение порядка равно 127. Значения порядка 0 и 255 используются в особых случаях, о которых рас- скажу чуть позже. Если значение порядка принадлежит диапазону от 1 до 254, то число, представленное конкретными значениями s (бит знака), e (порядок) и f (дробная часть), равно: (–1) s × 1,f × 2 е − 127 Выражение (–1) s используется для определения знака числа. Если s рав- но 0, то число положительное (поскольку любое число в степени 0 равно 1), если s равно 1, то число отрицательное (поскольку –1 в степени 1 равно –1). Следующая часть выражения 1,f представляет 1, за которой следует дво- ичный разделитель и 23-битная дробная значащая часть. Все это умножается на 2, возведенное в степень, значением которой является разность храняще- гося в памяти 8-битного смещенного порядка и числа 127. Я не упомянул о способе выражения такого распространенного числа, как 0. Похоже, о нем мы и забыли. Для этого предусмотрено несколько осо- бых случаев: ȣ если e равно 0, f равно 0, то число равно 0; как правило, для представления числа 0 во все 32 бита записываются нули, однако бит знака может быть равен 1, и в этом случае число интерпретируется как отрицательный ноль; бит может обозначать очень маленькое отрицательное число, для представления которого с одинарной точностью доступных цифр и по- рядков недостаточно; 396 Код ȣ если e равно 0, а f не равно 0, то число является действительным, но не нор- мализованным: (–1) s × 0,f × 2 –127 ; обратите внимание на 0 слева от двоичного разделителя значащей части; ȣ если e равно 255, а f равно 0, то число символизирует положительную или отрицательную бесконечность — в зависимости от знака s; ȣ если e равно 255, а f не равно 0, то значение считается «не числом» и обо- значается аббревиатурой NaN (Not a Number — «не число»); NaN может указывать на неизвестное число или на результат недопустимой матема- тической операции. Наименьшее нормализованное положительное или отрицательное дво- ичное число, которое можно представить с одинарной точностью в формате с плавающей точкой, следующее: 1,00000000000000000000000 ДВА × 2 –126 В этом числе после двоичного разделителя следуют 23 двоичных нуля. Наибольшее нормализованное положительное или отрицательное двоичное число, которое можно представить с одинарной точностью в формате с пла- вающей точкой, следующее: 1,11111111111111111111111 ДВА × 2 127 В десятичной системе счисления эти два числа приблизительно равны 1,175494351 × 10 –38 и 3,402823466 × 10 38 . Именно этими числами ограничива- ется диапазон чисел с плавающей точкой одинарной точности. Вероятно, вы помните, что десять двоичных цифр примерно эквивалент- ны трем десятичным цифрам. Под этим подразумеваю, что двоичное число, состоящее из десяти единиц, которое соответствует числу 3FFh в шестнадца- теричном формате и 1023 в десятичном, приблизительно равно числу из трех девяток, то есть 999. Таким образом: 2 10 ≈ 10 3 Из этого соотношения следует, что 24-битное двоичное число одинар- ной точности в формате с плавающей точкой приблизительно эквивалентно Глава 23. Фиксированная точка, плавающая точка 397 десятичному числу, состоящему из семи цифр. По этой причине считается, что число одинарной точности в формате с плавающей точкой имеет точность до 24 битов, или около семи десятичных знаков. Что это значит? Точность числа с фиксированной точкой очевидна. Например, денежная сумма, выраженная в виде числа с фиксированной точкой, имеющего два де- сятичных знака, определена с точностью до цента. Однако о числах с плаваю- щей точкой мы не можем сказать ничего подобного. В зависимости от значе- ния порядка число с плавающей точкой может иметь точность до долей цента или до десятков долларов. Правильнее было бы сказать, что число одинарной точности с плаваю- щей точкой имеет точность до одной части из 2 24 (одной части из 16 777 216, примерно до шести частей из 100 миллионов). Что это значит |