Если компьютер считает не так как надо то почему
Перейти к содержимому

Если компьютер считает не так как надо то почему

  • автор:

Арифметические и логические основы цифровых эвм Почему компьютер считает не так, как мы?

Итак, вы убедились, что арифметические операции над двоичными числами выполнять во много раз проще, чем над десятичными. Чего только стоит сведение анализа всевозможных ситуаций к четырем вариантам в случае двоичных чисел по сравнению со 100 ситуациями в десятичной системе, даже если учесть, что в двоичных числах разрядов примерно в три раза больше, чем в эквивалентных по величине десятичных числах.

Еще один аргумент в пользу двоичной системы можно извлечь из следующего рассуждения. Каждая ячейка оперативной памяти ЭВМ может быть использована для временного хранения какого-нибудь числа. И в этом смысле ее можно уподобить обычным конторским счетам. А теперь попробуем построить такие счеты, на которых можно было бы хранить числа, не превышающие 1000. В десятичной системе напрашивается конструкция, содержащая три проволочки (эквивалент трех цифр), на каждой из которых нанизано по 10 костяшек (эквивалент значение отдельной цифры). Для двоичных счетов потребуется уже 10 проволочек, так как самое большое десятиразрядное двоичное число всего на единицу меньше, чем 2 10 =1024. Но зато на каждой проволочке будет находиться лишь по две костяшки – значений у каждой двоичной цифры всего два. Сравним расход строительного материала, затраченного на создание указанных конструкций. Вы, конечно, понимаете, что основным материалом в счетах являются не деревянная рамка и не натянутые на ней проволочки. Мы вполне могли обойтись и без них, сложив костяшки, как первобытные бизнесмены, в отдельные кучки. Но на десятичные счеты пошло 30 костяшек, а на двоичные – всего 20.

Простота и экономичность двоичной системы по сравнению с привычной десятичной – аргументы весомые. Но есть еще один аргумент, связанный с принципом действия элементов, которые используются в ЭВМ. Дело в том, что большинство известных физических явлений имеют двоичную природу. Контакты электронного или электронно-механического реле могут быть замкнуты или разомкнуты. На бумажных перфокартах или перфолентах может быть пробито или не пробито отверстие, через которое соответственно пройдет или не пройдет луч света, фиксируемый фотодиодом. Полупроводниковый прибор (транзистор) может быть либо «открыт», либо «запрет». Конденсатор может быть или заряжен или разряжен. И таких примеров можно привести еще много. А вот найти в природе такое устройство, которое имело бы 10 фиксируемых разнонаправленных состояний, просто не удалось. Но даже если такие «десятичные» элементы и можно сконструировать, то создание соответствующего вычислительного устройства потребует несравненно больших затрат, чем «двоичная» ЭВМ.

Напомним, что двоичное представление чисел — это их запись в виде комбинации цифр 0 и 1. Бит — это модель устройства, которое может находиться только в двух состояниях: только из одного 0, или одной 1.

Цепочки бит в памяти компьютеров представляют собой различные числа, символы и любую другую информацию.

Группа из восьми битов называется байтом.

Байт — это очень удобная единица информации — не слишком большая и не слишком маленькая.

Содержимое одного байта может соответствовать 256 различным числам, поскольку общее количество различных комбинаций, в которых могут находиться восемь составляющих его битов, равно 256 =2 8 . С другой стороны, содержимое байта может интерпретироваться как буква или какой-нибудь другой символ, использующийся в текстах, если только предварительно пронумеровать все нужные символы. На самом деле, давно существует специальная таблица, где пронумерованы 256 стандартных символов. Эта таблица называется таблицей ASCII.

Итак, содержимое каждого байта можно интерпретировать либо как число, либо как символ. Работа в персональных компьютерах обычно происходит именно с байтами информации.

Шестнадцать битов подряд называются словом, а тридцать два бита подряд — двойным словом. Часто используются более крупные единицы информации: килобайт, или 1Кб — это 1024 байта (то есть два в десятой степени байт); мегабайт, 1Мб — это 1048576 байт (то есть два в двадцатой степени байт).

Оперативная память компьютера содержит программы и различные данные во время работы компьютера.

Оперативную память компьютера можно рассматривать как последовательность байтов, каждый из которых имеет собственный номер. Этот номер называется адресом данного байта.

Если компьютер считает не так, как надо, то почему?

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

решение вопроса

Связанных вопросов не найдено

  • Все категории
  • экономические 43,679
  • гуманитарные 33,657
  • юридические 17,917
  • школьный раздел 612,441
  • разное 16,911

Популярное на сайте:

Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах.

Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте.

Как быстро и эффективно исправить почерк? Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.

Как научится говорить грамотно и правильно? Общение на хорошем, уверенном и естественном русском языке является достижимой целью.

OFF: Почему компьютеры неправильно вычисляют?

Проверьте свой ПК на точность, точнее, на правильное вычисление.
1. Зайдите в EXCEL,
2. Занесите по 4 в А1 и В1,
3. Занесите по 0,3 в А2 и В2,
4. В А3: =$A$1*A2*(1-A2),
5. В В3: =$B$1*(B2-B2*B2), она такая же, как в А3, только раскрыты скобки,
6. В С3: =A3-B3, — получим 0, так как А3=В3,
7. Скопируйте A3:C3 в нижние 100 строк

Получается с 6 или 7 строки в столбце С уже нет 0.
Если все шаги проделать на других ПК, с разными Цп, то результаты будут разными.

Почему компьютеры считают с нуля?

Компьютеры традиционно подсчитывают числовые значения, начиная с нуля. Например, массивы в языках программирования на основе C начинаются с нуля индекса.

Какие исторические причины существуют для этого и какие практические преимущества имеет счет от нуля по сравнению с счетом от одного?

Примечание. Этот вопрос требует хорошо объясненных технических ответов, а не просто мнений, и предназначен для охвата компьютеров в целом, а не только программирования. Этот вопрос расширяет вопрос программистов «Почему структуры / массивы начинаются с нуля?»

17 ответов 17

Подсчет массивов от 0 упрощает вычисление адреса памяти каждого элемента.

Если массив хранится в данной позиции в памяти (это называется адресом), позиция каждого элемента может быть вычислена как

Если вы считаете первый элемент первым, вычисление становится

Не сильно отличается, но добавляет ненужное вычитание для каждого доступа.

редактировать

Использование индекса массива в качестве смещения — это не требование, а просто привычка. Смещение первого элемента может быть скрыто системой и учтено при выделении и обращении к элементу.

Дейкстра опубликовал статью «Почему нумерация должна начинаться с нуля» (pdf), где он объясняет, почему начинать с 0 — лучший выбор. Начиная с нуля, можно лучше представить диапазоны.

Хотя приведенные ниже принципы применимы и к десятичной, и к любой другой базе, отсчет от 0 в компьютерах можно легко понять из двоичной системы с фиксированными цифрами для представления чисел, используемых в компьютерах. Если у вас есть 8 битов, то есть 256 возможных комбинаций 1 и 0, которые могут быть выражены. Вы можете использовать эти 8-битные числа для выражения чисел 1-256, но при этом не будет 0, что полезно в математике как само по себе число, поэтому они используются для выражения чисел 0-255.

Это уже устанавливает прецедент естественного порядка, начиная с 0 (все 0 в двоичном представлении) до 255 (все 1 в 8-битном числе). Рассматривая систему представления чисел, начинать с 0 имеет смысл, потому что 0 — это «первое» число в системе, поэтому 1 — это «второе» число и так далее.

Дополнительная причина, по которой начинать с 0 в компьютерах так удобно, связана с концепцией смещений. Смещение — это число, представляющее расстояние от места в памяти, на жестком диске или на любом другом «адресуемом» носителе. В компьютерах практически все данные хранятся линейно, что означает, что существует порядок данных: первый байт, второй байт и т.д. Удобно выражать местоположение «областей» данных через смещение. Какой первый байт в блоке данных? Он находится со смещением «0», что означает, что он находится в 0 байтах после первого байта в блоке данных. Несмотря на то, что «1» может обозначать первый байт, это создает сложности при представлении данных по нескольким причинам:

  • Исключая использование 0 для адресации данных, вы сокращаете число вещей, к которым вы можете обращаться с помощью 8-битного числа, на единицу.
  • Чтобы вычислить смещение, которое необходимо на аппаратном уровне доступа к данным, в какой-то момент вы должны вычесть одно из нумерации, что представляет сложность.
  • Указатели на блок данных всегда указывают на первый блок, поэтому арифметика проста, когда вы начинаете с 0. (т.е. 1-й байт в первом блоке первого кластера данных равен 0 + 0 + 0, когда вы начинаете с 0 , это 1 + 1 + 1 — 1 -1, когда вы начинаете с 1.) Арифметика для этого, когда вы начинаете с 1 с вложенными структурами данных, как этот пример, может сбивать с толку.

Никогда не думал, что такая возможность для такого философа, как я, появится на Superuser. В основе лежит фундаментальное заблуждение, потому что нефилософы склонны пропускать мелкие детали. Вкратце: компьютеры не отсчитывают от нуля, но наименование позиций начинается с нуля.

В этом кажущемся несоответствии между компьютерной и человеческой (любой) техникой подсчета нет ничего странного. Давайте разложим вопрос.

  • Они не считаются с нуля

Компьютеры подсчитывают значения, начиная с нуля. Например, массивы в C.

  • Индекс (индикатор положения, счетчик) начинается с нуля. Количество элементов в массиве, где есть один элемент с нулевым индексом, равно единице.

Ноль практичен для представления пустоты чего-либо или средней точки шкалы. Это не практично для подсчета, потому что это невозможно по определению нуля.

В том же смысле, что и средняя точка шкалы, ноль можно использовать для представления самого края (абсолютного начала) коллекции. Вопрос не имеет смысла, потому что он не согласуется между «значениями подсчета» и «отсчетом с нуля».

Так что да, компьютеры подсчитывают с нуля, но они считаются с одного. Два слова имеют разное значение.

tal·ly [tal-ee]

имя существительное

  1. счет или расплата; запись дебета и кредита, счета в игре или тому подобное.
  2. все, на чем ведется счет или счет ..
  3. количество или группа записанных предметов.

считать [ количество ]

глагол (используется с объектом)

  1. проверять (отдельные единицы или группы коллекции) одну за другой, чтобы определить общее количество; сложить; перечислите: он пересчитал свои билеты и обнаружил, что у него было десять.
  2. считаться; вычислить; вычислить.
  3. перечислить или назвать цифры до: Закройте глаза и сосчитайте до десяти.

Практические причины адекватно описаны Дугви, мне нечего там добавить. Если бы у нас был профессор CS (60-х годов), чтобы дать исторический отчет .

Я думаю, что это уже было рассмотрено » проф.др.Эдсгер В. Дейкстра «- научный сотрудник Берроуза в письме от 11 августа 1982 г .: cf EWD831

Под названием: Почему нумерация должна начинаться с нуля. «Есть ли причины отдавать предпочтение одному соглашению другому?Да это так. «

Отметим также, что Дейкстра был в команде дизайнеров ALGOL 68 до конца 1968 года. Algol68 допускает массивы из 0, 1 или любого числа, которое программист сочтет подходящим для алгоритма. cf («Создание Алгола 68» рассказывает «Можете ли вы определить треугольные массивы?» кто-то (Тони Хоар?) прерываться. «Не только треугольный, но даже эллиптический», — ответил Аад и показал, как. «)

В частности, в Algol68, когда массивы (и матрицы) срезаются, они получают индекс @ 1, поэтому наблюдается смещение к массивам [1. ]. Но «1- ую » нижнюю границу можно переместить, чтобы начать с «0- й » позиции, указав «@ 0», например, вектор x [4:99 @ 2], матрицу y [4:99 @ 1,4:99 @ 0]. Аналогично, по умолчанию / смещение от 1 в циклах do

od (если явно не указано » from 0″) и от 1 для целочисленного случая i в

esac и $ c (

Кажется, что комментарии Дейкстры о мартовском проекте отчета 1968 года (MR93) и его настойчивость спровоцировали то, что, возможно, является войной пламени до начала использования: «есть сочинения, которые привлекательны, хотя и не грамматичны, и есть другие сочинения, которые являются чрезвычайно грамматическими, но отвратительно.Это то, что я не могу объяснить поверхностным людям «. EWD230

Заключительный отчет Алгола 68 (FR) был опубликован 20 декабря 1968 года, когда он был представлен на Мюнхенском совещании, а затем принят Рабочей группой. Впоследствии отчет был утвержден Генеральной Ассамблеей ИФИП ЮНЕСКО для публикации.

Около 23 декабря (?) 1968 Дейкстра, Дункан, Гарвик, Хоар, Рэнделл, Зигмюллер, Турски, Вуджер и Гарвик подписали AB31.1.1.1 «Отчет меньшинства», страница 7 (опубликовано в 1970 году).

Дистанционная аналогия, приведенная кем-то другим, дает очень практическую иллюстрацию:

«Как далеко ваш дом от ближайшей заправки?»

«Вы живете на заправке?»

«Нет, если бы я жил на заправке, это было бы 0 миль»

«Почему ты считаешь с нуля, а не с одного?»

Другим хорошим примером были бы дни рождения — мы не говорим, что кому-то исполнился год, а мы — год спустя.

Мы говорим о високосных годах или президентских выборах в США каждые четыре года, даже если считать одно: 2000, 2001, 2002, 2003, 2004 годы — пять лет. (Между прочим, римляне на некоторое время облажались, и високосные годы были слишком близко друг к другу)

Суть в том, что в реальном мире мы все время «отсчитываем» от нуля — «Сколько позиций после [начала массива] — это элемент, который вы хотите» просто оказывается вопросом, на который вы отвечаете с отсчетом от нуля во многих компьютерных программах. Вы бы не сказали, что первый элемент — одна позиция после старта, не так ли? Это начало.

Как уже говорили другие компьютеры, не считайте с нуля.

Индекс некоторых языков от 0. Индексирование от 0 имеет два основных преимущества:

Он преобразуется в сборку естественным образом, поскольку его можно интерпретировать как смещение от указателя на первую позицию.

Вы не получаете странности, когда вы хотите негативы. Сколько лет между 1BC и 1AD? Никто. Потому что, хотя до н.э. фактически отрицательные даты, нулевого года нет. Если бы был 0AD, не было бы здесь никаких проблем. Вы видите ту же проблему повсюду в науке, где люди наивно определили первый элемент в наборе как +1.

Подсчет естественно начинается с нуля

Вот алгоритм подсчета яблок в корзине:

После выполнения вышесказанного, count содержит количество яблок. Это может быть ноль, потому что корзины могут быть пустыми.

Если вы не пользуетесь своей кредитной картой целый месяц, получаете ли вы счет в 1 доллар? Или 1 цент?

Когда вы сбрасываете счетчик пробега на одометре вашего автомобиля, он переходит на 0001 или 0000?

Массивы могут предоставлять несколько представлений одних и тех же данных.

Рассмотрим массив из 32-битных структур d , каждая из которых состоит из 16-битных слов w . Каждое слово состоит из двух 8-битных байтов b . При нулевой индексации наложение выглядит очень удобно:

32-битный объект d[1] по адресу слова w[2] который легко вычисляется путем умножения индекса на 2, который является отношением размеров 32- и 16-битного объекта. Кроме того, в байтовой адресации это b[4] .

Это работает, потому что ноль равен нулю, в каждой единице измерения: байт, слово, двойное слово и так далее.

Посмотрите на приведенную выше диаграмму: она очень похожа на линейку, где преобразование единиц интуитивно понятно.

С одним основанным индексированием это ломает:

Теперь мы не можем просто умножить индекс d на 2, чтобы получить индекс w , или на 4, чтобы получить индекс b . Преобразование между единицами становится неуклюжим. Например, чтобы перейти от d[2] к b[4] , мы должны вычислить ((2 — 1) * 4) + 1 = 5 .

Мы должны вычесть это надоедливое смещение 1 в единицах d , затем выполнить масштабирование в естественной системе координат, основанной на нуле, и затем добавить обратно надоедливое 1 в единицах b . Обратите внимание, что это не то же самое 1! Мы вычитаем ширину одного двойного слова, но затем добавляем ширину в один байт .

Преобразование между различными представлениями данных становится чем-то вроде преобразования Цельсия-Фаренгейта.

Те, кто говорят, что с одноосновными массивами легко иметь дело на уровне реализации, потому что есть только простое вычитание 1, обманывают себя и вас. Это верно только в том случае, если мы не делаем никаких вычислений масштабирования для различных типов данных. Такие вычисления выполняются в любой программе, которая имеет гибкий взгляд на данные (например, многомерный массив, также доступный как одномерный) или который управляет хранением: например, распределитель памяти, файловая система или библиотека буфера видеокадров.

Минимизация цифр

В любой базе, если мы хотим использовать наименьшее количество цифр для реализации диапазона значений, который является степенью основания, мы должны начинать с нуля. Например, в базовой десятке трех цифр достаточно, чтобы дать нам тысячу различных значений от 0 до 999. Если мы начинаем с 1, мы переполняемся только одним значением, и нам нужны четыре цифры.

Это важно в компьютерах, потому что количество цифр в двоичном коде переводится в аппаратные адресные строки. Например, чип ПЗУ с 256 словами в нем может быть адресован от 0 до 255, что требует 8 бит: от 00000000 до 11111111. Если он адресован от 1 до 256, то нужны девять битов. Мы должны расточительно добавить еще одну трассировку адресов к плате или интегральной схеме. Таким образом, на практике возможно, что 0 будет просто называться 1 на уровне программного API для доступа к этому чипу. Запрос слова 1 фактически поместил бы 00000000 на 8-битную адресную шину. В противном случае запрос на 1 будет преобразован в адрес 00000001, как и ожидалось, но запрос на 256 будет преобразован в неиспользуемый в противном случае 8-битный адрес 00000000, а не в 9-битный адрес 100000000. Оба этих мешка являются действительно решениями в поисках проблемы, и их полностью избегают путем последовательного использования от 0 до 255 на оборудовании, в программном обеспечении и во всех пользовательских интерфейсах и документации.

Единичные смещения в корне глупы

Рассмотрим, например, западную теорию музыки. У нас есть диатонические весы с семью нотами, но мы называем пространство, которое они покрывают октавой ! Затем инверсия интервалов следует правилу девяти: например, инверсия третьего является шестым (вычтите три из девяти). Таким образом, три разных числа используются для чего-то такого простого: семь (ноты в масштабе), восемь (октава) и девять (от вычитания до инвертирования).

Если бы семь нот составляли септав или гептав, а интервалы были равны нулю, то мы вычли бы из семи до инвертирования. Все основано на семи.

Кроме того, интервалы могут быть легко сложены. В нынешней системе, если мы прыгнем на пятую, а затем еще на четверть, а затем на треть, мы не можем просто добавить их. Результирующий интервал на два меньше. Это не двенадцатый, а фактически десятый! На каждом этапе мы должны вычесть один. Повышение на пятую, а затем на четвертую — не девятый, а только октава.

В разумно разработанной музыкальной системе мы могли бы просто добавить интервалы для определения результирующих скачков. Последовательность нот, которая начинается и заканчивается на одной и той же ноте, будет иметь свойство, аналогичное закону напряжения вокруг цепи: все интервалы будут прибавляться к нулю.

Теория музыки и письменность сильно устарели. Большая часть этого не изменилась, так как дни, когда сочинение было сделано ручками при свете свечи.

Системы на основе одного путают одних и тех же людей, которые не могут обрабатывать массивы с нулями

Когда наступил 2000 год, многие были озадачены тем, что новое тысячелетие не началось. Те, кто указывал на то, что это не начнется до 2001 года, были расценены как партийные пижоны и паутины. В конце концов, вам 20, когда вам исполняется 20, верно? Не когда тебе исполнится 21. Если вы думали, что тысячелетие началось 1 января 2000 года, то вы не имеете права жаловаться на массивы, основанные на нуле, на любом языке программирования. Они работают так, как вам нравится. (Но, да, сторонниками смещений и массивов по принципу «один на один» являются dweebs и party-poopers. Столетия должны начинаться с XX00 лет, а тысячелетия с X000 лет.)

Календари тупые, но по крайней мере время суток начинается с нуля

Каждая новая минута на ваших часах начинается с:00 секунд. Каждый новый час начинается с 00:00 минут и секунд. И, по крайней мере на 24-часовых часах, день наступает, когда наступает полночь, и 11:59:59 увеличивается до 00:00:00.

Таким образом, если вы хотите вычислить секунды с полуночи для времени, подобного 13:53:04, вам просто нужно оценить 13 * 3600 + 53 * 60 + 4 . Нет безвкусно 1 сложения или вычитания.

Закрывающая напыщенная речь о MIDI

Хорошо, что это с музыкантами, даже предположительно техническими?

MIDI! Он использует нумерацию с нуля для программ и каналов при фактическом представлении сообщений в проводном режиме, но устройство Gear отображает его как 1 на основе! Например, программы от 0 до 127 на большинстве передач называются от 1 до 128, но некоторые вызывают их от 0 до 127 или даже предоставляют пользователю выбор.

Программы с 71 по 80 считаются «банком» из десяти. Так сказано прямо на моей педали MIDI, например. Футсвитчи помечены от 1 до 10, и если я в седьмом банке, они выбирают программы с 71 по 80. Однако некоторые устройства или компьютерные программы отображают номера программ от 1 до 128 от 0 до 127 или даже предоставляют пользователю выбор! Что хуже: системы на основе одного или хаос, созданный с использованием как одного, так и нулевого уровня, основанного одновременно?

Номера каналов MIDI называются от 1 до 16, но представлены двоичными числами от 0 до 15. Как будто вне зависимости от представления на основе одного, некоторые устройства используют дисковый переключатель для настройки номера канала, и часто эти переключатели просто используют двоичный код на основе нуля. Таким образом, если вы хотите канал 3, вы должны переключить его на 0010 (двоичный 2).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *