编程中的数字平方

时间:2010-04-06 16:10:13

标签: math

我知道这可能是一个非常简单的问题,但我该怎样做呢 n 2 在编程语言中?

是n * n吗?或者还有另一种方式吗?

5 个答案:

答案 0 :(得分:11)

n * n是最简单的方式。

对于支持取幂运算符的语言(本例中为**),您也可以执行n ** 2

否则,您可以使用数学库来调用pow(n, 2)之类的函数,但这可能只是简单地对数字进行平方。

答案 1 :(得分:5)

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。

根据语言的不同,您可能会在Python中使用power函数,例如pow(n, 2) in Cmath.pow(n, 2) ...因为这些power函数会转换为浮点数数字,它们在可能出现溢出的情况下更有用。

答案 2 :(得分:2)

有许多编程语言,每种语言都有自己的表达数学运算的方式。

一些常见的将是:

x*x

pow(x,2)

x^2

x ** 2

square(x)

(* x x)

如果您指定特定语言,我们可以为您提供更多指导。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

除非语言具有明确的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)基本类型。如果您真的想进入它,如果需要在软件中为您正在使用的类型实现乘法,则有一些方法可以使乘法比乘法更快。然而,你几乎不会发现自己处于这种重要的境地。