0

我正在尝试使用 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 )

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

4

3 回答 3

7

C++ 本身不支持您尝试对其标准数据类型进行的操作。您将需要至少 104 位来表示从 0 到 67^17 的每个整数。

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

#include <cmath>

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

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

要获得正确答案,需要使用更高精度的库,例如GMP,它的类型可以容纳超过您所需的 104 位,并提供自己的快速求幂函数,例如this

于 2013-05-16T08:10:27.163 回答
0

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

于 2013-05-16T08:40:41.527 回答
0

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

只包括

#include <math.h> 

或者

 #include <cmath> 

接着

pow(65,17);
于 2013-05-16T08:09:14.670 回答