Умножение, деление и квадратный корень без использования арифметических операторов - PullRequest
2 голосов
/ 08 декабря 2011

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

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

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

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

Что касаетсяквадратный корень, просто реализуйте итерацию Ньютона на основе операций из шага 1.

0 голосов
/ 08 декабря 2011

Функция быстрого квадратного корня (даже быстрее, чем функция библиотеки!):

РЕДАКТИРОВАТЬ: не правда, на самом деле медленнее из-за недавних аппаратных улучшений. Это, однако, код, используемый в Quake II.

double fsqrt (double y)
{
    double x, z, tempf;
    unsigned long *tfptr = ((unsigned long *)&tempf) + 1;
    tempf = y;
    *tfptr = (0xbfcdd90a - *tfptr)>>1; /* estimate of 1/sqrt(y) */
    x =  tempf;
    z =  y*0.5;                        /* hoist out the “/2”    */
    x = (1.5*x) - (x*x)*(x*z);         /* iteration formula     */
    x = (1.5*x) – (x*x)*(x*z);
    // x = (1.5*x) – (x*x)*(x*z);      /* not necessary in games */
    return x*y;
}
0 голосов
/ 08 декабря 2011

Используя побитовые операторы, один пример, который я нашел здесь:

http://geeki.wordpress.com/2007/12/12/adding-two-numbers-with-bitwise-and-shift-operators/

Сложение можно перевести на множественность и деление. Для sqrt вы можете использовать серию Taylor. http://en.wikipedia.org/wiki/Taylor_series

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...