Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Двоичный [ править ]

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

 ( SETQ  номер  # b1101001 )  ; # b1101001 - 105  ( зольный  номер  -1 )  ; # b0110100 - 105 >> 1 ⇒ 52  ( число золы  -4 ) ; # b0000110 - 105 >> 4 ≡ 105 / 2⁴ ⇒ 6.  

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

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

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

Десятичный [ править ]

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

  • Запишите N , поставив слева ноль.
  • Просмотрите цифры N в перекрывающихся парах, записывая цифры результата из следующей таблицы.

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

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

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

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

Из примера видно, что 0 - четное число .

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

См. Также [ править ]

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

Ссылки [ править ]

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