如何求2的n次方 ( 积分: 200 )

  • 主题发起人 主题发起人 wanderld
  • 开始时间 开始时间
W

wanderld

Unregistered / Unconfirmed
GUEST, unregistred user!
如何求2的n次方,对于2 shl n,n>31时就无法计算了,如
var k:int64
begin
k:=(1 shl 33);
showmessage(inttostr(k));
end;
结果是2
 
如何求2的n次方,对于2 shl n,n>31时就无法计算了,如
var k:int64
begin
k:=(1 shl 33);
showmessage(inttostr(k));
end;
结果是2
 
求x的n 次方,用:Exp(Ln(x)*n)
 
我不知道有没有现成的函数,但可以这样做:
var i :int64;

n :integer;
//你所需的 n 次方
m :integer;
//求余的时候用到
begin
n :=35;
//输入你要的 n 次方数,以35为例
m :=n mod 30 ;
//先求余
i :=1 shl 30;
//先左移30位,再多就溢出了
i :=i*(1 shl m);
//在 i 基础上再运算
showmessage(inttostr(i));
//2的35次方结果为 34359738368
end;
不过这里只是适合 n 为30 至60 的数,其他数可加上判断再进行操作。
不知这样效果合你意否? ^_^
 
不知道能不能用对数方法算,没试过,想象的。
 
power就可以!
 
uses Math;
Power(2, N);
 
来晚了,就用Power。
 
关于结果是2
---------------------
var k:int64
begin
k:=(1 shl 33);
showmessage(inttostr(k));
end;
---------------------
1 shl 33 在值编译的时候就已经定下来了, 至于为什么是2, 就要问一下高手了。
可以改成这样:
var k:int64
begin
k := 1;
k:=(k shl 33);
showmessage(inttostr(k));
end;
就不是2了。
 
关于求n的m次方,为啥不是这样:
x:=Exp(Ln(n)*m);
......
var x,n,m:real;
begin
n:=strtoint(edit1.text);
m:=strtoint(edit2.text);
x:=Exp(Ln(n)*m);
edit3.Text :=floattostr(x) ;
 
function Power(const Base, Exponent: Extended): Extended;
Raises Base to any power.
use math
power(2,N);
 
后退
顶部