число в квадрате в программировании - PullRequest
6 голосов
/ 06 апреля 2010

Я знаю, что это, вероятно, очень простой вопрос, но как бы я сделал что-то вроде n 2 на языке программирования?

Это n * n?Или есть другой способ?

Ответы [ 5 ]

11 голосов
/ 06 апреля 2010

n * n - самый простой способ.

Для языков, которые поддерживают оператор возведения в степень (** в этом примере), вы также можете сделать n ** 2

В противном случае вы можете использовать библиотеку Math для вызова такой функции, как pow(n, 2), но это, вероятно, излишне просто для возведения в квадрат числа.

5 голосов
/ 06 апреля 2010

n * n почти всегда будет работать - пара случаев, когда это не сработает, - это префиксные языки (Lisp, Scheme и др.) Или постфиксные языки (Forth, Factor, bc, dc); но, очевидно, тогда вы можете просто написать (* n n) или n n* соответственно.

Также произойдет сбой при переполнении:

#include <limits.h>
#include <stdio.h>
int main()
{
    volatile int x = INT_MAX;
    printf("INT_MAX squared: %d\n", x * x);
    return 0;
}

Я включил квантификатор volatile, чтобы указать, что это можно скомпилировать с -Wall и не выдавать никаких предупреждений, но на моем 32-битном компьютере это говорит о том, что INT_MAX в квадрате равно 1.

В зависимости от языка, у вас может быть функция power, такая как pow(n, 2) в C или math.pow(n, 2) в Python ... Так как эти power функции приводятся к числам с плавающей точкой, они более полезны в случаях, когда возможно переполнение.

2 голосов
/ 06 апреля 2010

Если n является целым числом: p:

int res=0;
for(int i=0; i<n; i++)
    res+=n; //res=n+n+...+n=n*n

Для натуральных чисел вы можете использовать рекурсию:

int square(int n){
if (n>1)
   return square(n-1)+(n-1)+n;
else 
   return 1;
}

Расчет с использованием выделения массива (крайне неоптимальный):

#include <iostream>
using namespace std;

int heapSquare(int n){
   return sizeof(char[n][n]);
}

int main(){
for(int i=1; i<=10; i++)
   cout << heapSquare(i) << endl;
return 0;
}

Использование битового сдвига (древнеегипетское умножение):

int sqr(int x){
   int i=0;
   int result = 0;
   for (;i<32;i++)
      if (x>>i & 0x1)
         result+=x << i;   
   return result;
}

Монтаж:

  int x = 10;
  _asm_ __volatile__("imul  %%eax,%%eax"
                     :"=a"(x)
                     :"a"(x)
                      );
  printf("x*x=%d\n", x);
2 голосов
/ 06 апреля 2010

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

Вот некоторые из распространенных:

x*x

pow(x,2)

x^2

x ** 2

square(x)

(* x x)

Если вы укажете конкретный язык, мы можем датьвам больше указаний.

1 голос
/ 06 апреля 2010

Всегда используйте умножение языка, если в языке нет явной функции square. В частности, избегайте использования функции pow, предоставляемой большинством математических библиотек. Умножение будет (за исключением самых возмутительных обстоятельств) всегда быстрее и - если ваша платформа соответствует спецификации IEEE-754, что делает большинство платформ - даст правильно округленный результат. Во многих языках нет стандарта, определяющего точность функции pow. Как правило, это даст высококачественный результат для такого простого случая (многие реализации библиотек будут возводить в квадрат особые случаи, чтобы спасти программистов от самих себя), но вы не хотите зависеть от этого [1].

Я вижу огромное количество кода на C / C ++, где разработчики написали:

double result = pow(someComplicatedExpression, 2);

возможно, чтобы не вводить это сложное выражение дважды или потому, что они думают, что это каким-то образом замедлит их код для использования временной переменной. Не будет Компиляторы очень, очень хороши в оптимизации такого рода вещей. Вместо этого напишите:

const double myTemporaryVariable = someComplicatedExpression;
double result = myTemporaryVariable * myTemporaryVariable;

Чтобы подвести итог: используйте умножение. Это всегда будет, по крайней мере, так же быстро и, по крайней мере, так же точно, как все, что вы можете сделать [2].

1) Последние компиляторы на основных платформах могут оптимизировать pow(x,2) в x*x, когда семантика языка позволяет это. Однако не все компиляторы делают это при всех настройках оптимизации, что является рецептом для сложных отладочных ошибок округления. Лучше не зависеть от этого.

2) Для основных типов. Если вы действительно хотите разобраться с этим, если умножение необходимо реализовать в программном обеспечении для типа, с которым вы работаете, есть способы выполнить операцию возведения в квадрат, которая быстрее, чем умножение. Однако вы почти никогда не окажетесь в ситуации, когда это имеет значение.

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