Как компьютер умножает числа
Как компьютер выполняет умножение на 2 числа, скажем, 100 * 55.
Моя догадка заключалась в том, что компьютер сделал повторное дополнение для достижения размножения. Конечно, это может иметь место для целых чисел. Однако для чисел с плавающей запятой должна быть какая-то другая логика.
Примечание. Это было задано в интервью.
ОТВЕТЫ
Ответ 1
Повторное добавление было бы очень неэффективным способом умножения чисел, представьте, что вы умножаете 1298654825 на 85324154. Гораздо быстрее использовать длительное умножение с помощью двоичного файла.
Для чисел с плавающей запятой используется научная нотация.
Чтобы умножить их вместе, умножьте мантиссы и добавьте показатели
Компьютер выполняет это с использованием двоичных эквивалентов
Ответ 2
Обычно используемый метод называется частичными продуктами, такими как люди, поэтому, например, имея 100*55 , он сделает что-то вроде
В основном старые подходы использовали алгоритм сдвига и накопления, в котором вы сохраняете сумму при смещении частичных продуктов для каждой цифры второго номера. Единственная проблема такого подхода заключается в том, что числа хранятся в 2-дополнении, поэтому вы не можете выполнять простой бит на бит умножения во время shifing.
В настоящее время большинство оптимизаций могут суммировать все частичные данные всего за 1 цикл, что позволяет быстрее вычислять и упрощать распараллеливание.
В конце вы можете найти некоторые реализации, такие как
Ответ 3
Один из способов - использовать длинное умножение в двоичном формате:
Ответ 4
Компьютеры используют алгоритм Бута или другие алгоритмы, которые выполняют перенос и добавление для арифметических операций. Если вы изучали курсы компьютерной архитектуры, книги по компьютерной архитектуре должны быть хорошим местом для изучения этих алгоритмов.
Ответ 5
Хорошо, вот иди. Я написал это некоторое время назад (1987!), Поэтому некоторые вещи изменились, в то время как другие остались теми же.
Ответ 6
Интуитивно вы можете свести к минимуму повторные добавления, также используя сдвиг.
В терминах поплавков эта статья выглядит довольно актуальной:
Ответ 7
Ответ 8
Чтобы умножить два числа с плавающей запятой, используется следующая процедура:
- Умножьте мантиссы
- Добавьте экспоненты
- Нормализовать результат (десятичная точка появляется после первой ненулевой цифры)
Итак, в базе 10 для умножения 5.1E3 и 2.6E-2
Умножьте мантиссы = > 5.1 * 2.6 = 13.26 (это можно сделать с помощью целочисленного умножения, если вы отслеживаете, где должна быть десятичная точка)
Добавьте экспоненты = > 3 + -2 = 1
Дает нам результат 13.26E1
Нормализовать 13.26E1 = > 1.326E2
Ответ 9
Я просто кодирую простую программу, умножая два числа, хранящихся в 2 строках в файле, используя алгоритм длительного умножения. Он может умножать два числа, которые имеют более 1 миллиарда чисел друг в друге
Помните, как в школе умножали "столбиком"? Скажем, числа 52 и 37 умножают так:
Умножение двузначных чисел мы свели 1) к умножению однозначных (оно короткое), 2) к сложению, 3) и еще к сдвигу, эта операция настолько проста, что мы её и не замечаем. Она соответствует умножению на степень десятки, и «почти бесплатна»:
Умножение двух двузначных чисел требует четырех коротких умножений.
Умножение двух трехзначных чисел требует девяти коротких умножений.
Умножение двух N -значных чисел сводится к N ² коротким умножениям (и ещё к сложениям и сдвигам).
Для компьютерных вычислений умножение – самая затратная по времени операция, а сложение и тем более сдвиг – нет; поэтому сложность алгоритма умножения длинных чисел оценивают числом коротких, «однозначных» умножений. (Внутри компьютера числа представляются не так, как в школьных тетрадках, основание счисления будет не 10, а какая-то степень двойки, но для оценки это непринципиально.)
Примерно в 1956 году А.Н.Колмогоров предположил, что алгоритм c N ² “однозначными” умножениями – наилучший из всех возможных. В его семинаре участвовал молодой математик Анатолий Карацуба, который и опроверг гипотезу учителя. В 1960 году он придумал алгоритм, который работает быстрее.
Через них получается выражение для
А это все, что нужно знать, чтобы вычислить произведение:
Нам потребовалось не N ² операций, а только
Для умножения в столбик ручкой на бумаге этот метод неудобен. У него нет такой элегантной формы записи, им сложнее овладеть, да и выигрыша во времени в бытовых ситуациях он не дает. Но для компьютерного умножения очень длинных чисел это заметное улучшение.
Как это бывает в математике, после первого шага началась гонка за наилучшим результатом. Всегда приятно поставить рекорд: найти больше всех цифр числа π или самое большое простое число.
Немецкие математики Арнольд Шёнхаге и Фолькер Штрассен в 1971 году придумали, как использовать быстрое преобразование Фурье, чтобы умножать большие числа еще быстрее. Они свели задачу умножения чисел к задаче умножения многочленов, и применили к таким функциям быстрое преобразование Фурье. (По версии журнала Computing in Science & Engineering БПФ – один из 10 важнейших алгоритмов ХХ столетия.) Теперь можно было умножать за
операций. И в XX веке все компьютеры так и умножали. Но сами Арнольд Шёнхаге и Фолькер Штрассен выдвинули две гипотезы: 1) что можно умножать еще быстрее – за N log ( N ), и 2) что это уже нижняя граница, быстрее умножить не получится.
В 2007 году Мартин Фюрер предложил алгоритм еще шустрее, но который все же не достиг идеала в N log ( N ).
Его достигли в этом году Дэвид Харви и Йорис ван дер Ховен (DAVID HARVEY AND JORIS VAN DER HOEVEN). Они опубликовали два новых алгоритма , которые оба требуют N log ( N ) простых операций. Первый технически проще, но опирается на недоказанное предположение о простых числах в арифметических прогрессиях. Второй требует изощренной техники, но зато достигает идеала без всяких недоказанных предположений.
Первая гипотеза Шёнхаге и Штрассена таким образом доказана, а вторая еще ждет своих героев. Математики научились умножать быстро и еще быстрее, но пока не знают: правда ли, что быстрее уже некуда.
Как компьютер выполняет умножение на 2 числа, скажем, 100 * 55.
Я предполагал, что компьютер сделал повторное сложение для достижения умножения. Конечно, это может быть в случае с целыми числами. Однако для чисел с плавающей запятой должна быть какая-то другая логика.
Примечание: это было задано в интервью.
повторное сложение было бы очень неэффективным способом умножения чисел, представьте себе умножение 1298654825 на 85324154. Гораздо быстрее просто использовать длинное умножение с помощью binary.
для чисел с плавающей запятой используется научная нотация.
чтобы умножить их вместе, умножьте мантиссы и добавьте показатели
компьютер делает это, используя двоичные эквиваленты
обычно используемый метод называется частично продукты как люди делают, так, например, 100*55 он будет делать что-то вроде
в основном старые подходы использовали алгоритм сдвига и накопления, в котором вы сохраняете сумму при сдвиге частичных произведений для каждой цифры второго числа. Единственная проблема этого подхода заключается в том, что числа хранятся в 2-дополнении, поэтому вы не можете делать простое умножение на бит shifing.
В настоящее время большинство оптимизации способны суммировать все партиалы всего за 1 цикл, что позволяет быстрее вычислять и легче распараллеливать.
в конце вы можете найти некоторые реализации, такие как
один из способов - использовать длинное умножение в двоичном формате:
это иногда называют shift и добавить метод.
компьютеры используют алгоритм бута или другие алгоритмы, которые делают сдвиг и добавление для арифметических операций. Если вы изучали курсы компьютерной архитектуры, книги по компьютерной архитектуре должны быть хорошим местом для изучения этих алгоритмов.
хорошо, вот так. Я написал это некоторое время назад (1987!), так что некоторые вещи изменились в то время как другие остаются неизменными.
интуитивно вы можете минимизировать повторные добавления, также используя сдвиг.
с точки зрения поплавков эта статья выглядит довольно актуальной:
для умножения двух чисел с плавающей запятой используется следующая процедура:
- умножьте мантиссы
- добавить показатели
- нормализовать результат (десятичная точка появляется после первой ненулевой цифры)
Итак, в базе 10 умножить на 5.1Е3 и 2.6 Е-2
умножьте мантиссы = > 5.1 * 2.6 = 13.26 (NB это можно сделать с целочисленным умножением, если вы отслеживаете, где десятичная точка должна be)
добавить показатели => 3 + -2 = 1
дает нам результат 13.26E1
нормализовать 13.26E1 => 1.326E2
Я просто код простой программы умножить два числа, хранящиеся в 2 строки в файле с помощью алгоритма длинного умножения. Он может умножить два числа, которые имеют более 1 миллиарда чисел друг в друге
Компьютеры превращают каждое число в двоичное. Числа, которые мы используем, выражены в базе 10. Каждые 10 1 равны 1 десять, каждые 10 десятков равны 100, и так далее. В двоичном коде вы увеличиваете единицу каждые 2 числа. Таким образом, 2 равны 1 два, 2 двойки равны 1 4 и так далее. Например, число 9 будет 1001 в двоичном виде: 1 один, 0 двойок, 0 четверок и 1 восемь. 1 + 8 = 9. Компьютеры делают это, потому что легче проектировать схемы, которые имеют только значения 1 или 0, чем схемы с 10 отдельными значениями в каждой.
прибавление
Компьютеры имеют базовые математические операции, такие как сложение и вычитание, запрограммированные в них. Добавить в двоичном виде чрезвычайно просто. Если у вас есть 2 числа со значением 1, вы сохраняете 0 и перемещаете перенос 1. В противном случае вы записываете большее из двух чисел в этом слоте. Например, если вы добавляете 5 + 4, вы получаете: 0101 + 0100. В первом слоте у вас есть 1 + 0, поэтому вы сохраняете большее число: 1. Во втором слоте у вас есть два 0, поэтому Вы сохраняете 0 (так как оба числа одинаковы. В третьем слоте у вас есть две 1, поэтому вы сохраняете 0 и носите 1. В итоге вы получите число 1001 или 9.
Умножение.
Компьютеры используют длинное умножение, но они делают это в двоичном формате. Если компьютер умножает число на 1, он возвращает 1. Это гораздо более простая система, чем основание 10, даже если он требует больше шагов. Например, в базе 10 задача 8 * 9 - это простая одношаговая задача без длительного умножения. Однако в двоичном виде каждое число имеет длину 4 цифры, а решение имеет длину 7 цифр!
Вычитание
Вычитание выполняется в два этапа. Вместо того, чтобы вычитать число, двоичный компьютер добавляет свой комплимент, число с теми, где в оригинале есть нули, и нулями, где в оригинале есть единицы. Например, тогда как 4 - 0100 в двоичном, отрицательное 4 - 1011. Таким образом, для 7 - 4 мы получаем 0111 + 1011 = 10010. Число с левой стороны затем перемещается вправо, давая нам 0011 = 3.
Как изменить десятичные числа в смешанные числа
Научиться преобразовывать десятичное число в смешанное не просто занятая работа; это имеет большое значение при выполнении математических операций или интерпретации результатов. Например, при работе с алгеброй почти всегда проще работать с дробями, а дроби облегчают обработку измерений в единицах США.
Как заменить неправильные дроби на смешанные числа или целые числа
Для многих детей и взрослых дроби создают определенные трудности. Это особенно верно для неправильных дробей, в которых числитель или верхнее число больше, чем знаменатель или нижнее число. Даже когда педагоги пытаются соотнести дроби с реальной жизнью, сравнивая дроби, например, с кусочками пирога, .
Как изменить смешанные числа в целые числа
Смешанные числа почти всегда включают целое число и дробь - поэтому вы не можете полностью изменить их на целое число. Но иногда вы можете еще больше упростить это смешанное число или выразить его как целое число с последующим десятичным числом.
Читайте также: