число в квадрате при программировании

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

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

5 ответов


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

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

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


n * n почти всегда будет работать - пара случаев, когда он не будет работать, находятся в языках префиксов (Lisp, Scheme и co.) или постфиксные языки (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.

в зависимости от языка, у вас может быть


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

некоторые общие из них:

x*x

pow(x,2)

x^2

x ** 2

square(x)

(* x x)

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


если 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;
}

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

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);

всегда используйте умножение языка, если язык не имеет явного . Это, как правило, дает высококачественный результат для такого простого случая (многие реализации библиотек будут иметь специальный квадрат, чтобы спасти программистов от самих себя), но вы не хотите зависеть от этого[1].

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

double result = pow(someComplicatedExpression, 2);

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

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

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

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

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