Деление на два - Division by two

В математика, деление на два или же уменьшение вдвое также был назван посредничество или же омрачение.[1] Отношение к этой операции как к операции, отличной от умножения и деления на другие числа, восходит к древним египтянам, чьи алгоритм умножения использовал деление на два как один из основных шагов.[2]Некоторые математики еще в шестнадцатом веке продолжали рассматривать деление пополам как отдельную операцию.[3][4] и его часто продолжают рассматривать отдельно в современных компьютерное программирование.[5]Выполнить эту операцию просто в десятичная арифметика, в двоичная система счисления используется в компьютерном программировании и в других четных базы.

Двоичный

В двоичной арифметике деление на два может выполняться битовый сдвиг операция, которая сдвигает номер один вправо. Это форма снижение силы оптимизация. Например, 1101001 в двоичном формате (десятичное число 105), сдвинутое на одну позицию вправо, будет равно 110100 (десятичное число 52): бит младшего разряда, 1, удаляется. Аналогично деление на любые сила двух 2k может выполняться сдвигом вправо k позиции. Поскольку битовые сдвиги часто выполняются гораздо быстрее, чем деление, такая замена деления сдвигом может быть полезным шагом в оптимизация программы.[5] Однако ради переносимость программного обеспечения и удобочитаемости, часто лучше писать программы, используя операцию деления и полагаясь на компилятор для выполнения этой замены.[6] Пример из Common Lisp:

 (setq номер # b1101001)   ; # b1101001 - 105 (пепел номер -1)           ; # b0110100 - 105 >> 1 ⇒ 52. (пепел номер -4)           ; # b0000110 - 105 >> 4 ≡ 105 / 2⁴ ⇒ 6.

Однако приведенные выше утверждения не всегда верны, когда речь идет о разделении подписанный двоичные числа. Сдвиг вправо на 1 бит делит на два с округлением в меньшую сторону. Однако в некоторых языках деление двоичных чисел со знаком округляется до 0 (что, если результат отрицательный, означает округление в большую сторону). Например, Ява один из таких языков: в Java -3 / 2 оценивает -1, в то время как -3 >> 1 оценивает -2. Итак, в этом случае компилятор не можешь оптимизировать деление на два, заменив его битовым сдвигом, когда дивиденд может быть отрицательным.

Двоичная с плавающей точкой

В двоичном формате арифметика с плавающей запятой, деление на два можно выполнить, уменьшив показатель степени на единицу (если результат не равен субнормальное число ). Многие языки программирования предоставляют функции, которые можно использовать для деления числа с плавающей запятой на степень двойки. Например, Язык программирования Java предоставляет метод java.lang.Math.scalb для масштабирования в два раза,[7] и Язык программирования C обеспечивает функцию ldexp с той же целью.[8]

Десятичный

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

  • Написать N, поставив слева ноль.
  • Просмотрите цифры N в перекрывающихся парах запишите цифры результата из следующей таблицы.
Если первая цифраЧетноеЧетноеЧетноеЧетноеЧетноеСтранныйСтранныйСтранныйСтранныйСтранный
Вторая цифра0 или 12 или 34 или 56 или 78 или 90 или 12 или 34 или 56 или 78 или 9
Написать0123456789

Пример: 1738/2 =?

Напишите 01738. Теперь займемся поиском результата.

  • 01: четная цифра, за которой следует 1, напишите 0.
  • 17: нечетная цифра, за которой следует 7, напишите 8.
  • 73: нечетная цифра, за которой следует 3, напишите 6.
  • 38: нечетная цифра, за которой следует 8, напишите 9.

Результат: 0869.

Из примера видно, что 0 четный.

Если последняя цифра N является странный к результату следует прибавить 0,5.

Смотрите также

  • Одна половина
  • Медиана, значение, которое разделяет набор значений данных на два равных подмножества
  • Пополам, разбиение геометрического объекта на две равные половины
  • Димидиация, геральдический метод соединения двух гербов путем разделения их рисунков на две части.

Рекомендации

  1. ^ Стил, Роберт (1922), Самая ранняя арифметика на английском языке, Общество ранних английских текстов, 118, Oxford University Press, стр. 82.
  2. ^ Шабер, Жан-Люк; Барбин, Эвелин (1999), История алгоритмов: от камешка до микрочипа, Springer-Verlag, стр. 16, ISBN  978-3-540-63369-3.
  3. ^ Джексон, Ламберт Линкольн (1906), Образовательное значение арифметики шестнадцатого века с точки зрения нашего времени, Взносы на образование, 8, Колумбийский университет, стр. 76.
  4. ^ Уотерс, Э. Г. Р. (1929), "Французский алгоритм пятнадцатого века из Льежа", Исида, 12 (2): 194–236, Дои:10.1086/346408, JSTOR  224785.
  5. ^ а б Wadleigh, Kevin R .; Кроуфорд, Изом Л. (2000), Оптимизация программного обеспечения для высокопроизводительных вычислений, Прентис Холл, стр.92, ISBN  978-0-13-017008-8.
  6. ^ Крюк, Брайан (2005), Написание переносимого кода: введение в разработку программного обеспечения для нескольких платформ, Пресс без крахмала, стр. 133, ISBN  978-1-59327-056-8.
  7. ^ "Math.scalb". Стандарт платформы Java Ed. 6. Получено 2009-10-11.
  8. ^ Языки программирования - C, международный стандарт ISO / IEC 9899: 1999, Раздел 7.12.6.6.