2016-09-14 18 views
9

Я знаком с известным вопросом реализации умножения с использованием сложения или возведения в степень с использованием умножения с использованием алгоритмов циклизации или бит-сдвига и добавления смещенных битовых групп.Внедрение с использованием умножения

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

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

Спасибо.

+8

Это математический вопрос и не имеет отношения к программированию. – nwellnhof

+0

читал о продукте Коши, может быть, вы получите некоторые подсказки – Monah

+0

Я не математик, но я не знаю о такой вещи. – duffymo

ответ

7

Да, конечно:

a + b = ln(exp(a) * exp(b))

Edit: Подъемное глаза над практичностью выше к более спекулятивной, я бы сказал, что вы должны ожидать, чтобы иметь возможность выполнять более низкие операции уровня через более , Пока работа на более высоком уровне строится на более низких уровнях, они должны иметь возможность выполнять, по крайней мере, то, что могут сделать их строительные камни. Однако, возможно, не так легко и просто, см. Комментарий ниже. Человек может сказать вам, что 1 + 1 = 2, но было бы намного дешевле и безопаснее просить компьютер или даже более простое устройство.

+4

Обратите внимание на риск переполнения и неточный результат при использовании в реальных системах. – Leon

+0

Что делать, если мы хотим использовать фактически реализуемые операции, можно ли это сделать? – harold

+1

Ну, ln() и exp(), конечно, реализуются как ln (exp (a) * exp (b)), но если вы имеете в виду «Реализуемое без использования добавления», тогда мы в основном говорим о выполнении добавления без выполнения дополнение. Это должно быть очень сложно. –

2

Ну, если вы хотите быть педантичным, два числа в двоичном представлении могут быть добавлены с использованием только побитовых операторов OR, XOR и AND без строго «добавления» чего угодно. Для получения суммы а + B = C, п-й бит может быть вычислена следующим образом:

с п = а п XOR б п исключающее несут
перенос = (а п И б п) ИЛИ ((а п XOR б п) и нести)

И вы должны из с мы избегаем использования n ++ при итерации по битам и выбрасываем пару умножений для хорошей оценки:

int add(int a, int b) { 
    int c = 0; 
    char carry = 0; 
    for (int mask = 1; mask; mask *= 2) { 
     char an = a & mask ? 1 : 0; 
     char bn = b & mask ? 1 : 0; 
     c |= (an^bn^carry) * mask; 
     carry = an & bn | (an^bn) & carry; 
    } 
    return c; 
} 
+1

Это не совсем педантично. Укажите «строгое добавление». (Насколько я могу судить, то, что вы описываете с помощью бит-операций, фактически более похоже на то, что фактически делает компьютер, когда мы нажимаем '+'.) –

+0

Это одна упрямая интерпретация 'Использование умножения'/** только ** _higher такие как умножение, или_ [трансцендентные]. – greybeard

+1

@greybeard Я взял слова «некоторый алгоритм, объединяющий эти операции (и, возможно, побитовые операторы)», буквально :-) – m69

 Смежные вопросы

  • Нет связанных вопросов^_^