c ++:正确计算大数量的功率的方法

时间:2013-05-16 08:00:08

标签: c++ double

我试图用c ++计算65 ^ 17。 我写了下面的代码但是在65 ^ 11时得到了错误的值。 计算答案的正确方法是什么? (即65 ^ 17)

代码:

long double data= 1;
int m_ne=17;
int i_data=65;
for(int i=1;i<= m_ne;i++)
{
     data =  data  * (i_data);
     std::cout.precision(15);
     std::cout<<" "<<std::fixed <<data<<std::endl;
 }

输出:

65.000000000000000
 4225.000000000000000
 274625.000000000000000
 17850625.000000000000000
 1160290625.000000000000000
 75418890625.000000000000000
 4902227890625.000000000000000
 318644812890625.000000000000000
 20711912837890625.000000000000000
 1346274334462890625.000000000000000
 87507831740087890624.000000000000000

我尝试了以下选项,但都是徒劳的

1. data = floor( data +0.5) * i_data ;        

2. data = floor( data +0.5) * floor (i_data + 0.5 ) ;        
By declaring i_data as float .

3.
data =  data * i_data ;        
data = floor ( data + 0.5 )

我读了关于双重的帖子,但我没有得到解决方案。

3 个答案:

答案 0 :(得分:7)

C ++本身不支持您尝试使用其标准数据类型。您需要至少104位来表示0到67 ^ 17之间的每个整数。

如果您觉得近似值对您来说足够好,那么您可以做的最好就是使用附带的幂函数的long double版本:

#include <cmath>

::std::cout << ::std::powl(65, 17) << ::std::endl;

然而,你不会得到正确的输出,因为65 ^ 17是奇数(最后一个十进制数字是5),因此需要一个至少有104位尾数的浮点类型(long double通常没有)。

要获得正确的答案,需要使用更高精度的库,例如GMP,其类型可以保存超过您需要的104位,并提供其自己的快速取幂函数,如{ {3}}

答案 1 :(得分:0)

有pow功能。 http://www.cplusplus.com/reference/cmath/pow/

请加入

#include <math.h> 

 #include <cmath> 

然后

pow(65,17);

答案 2 :(得分:0)

您应该使用Bignum库gmp来处理标准c ++类型无法处理的大型数据类型。 http://gmplib.org/