我试图用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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
65.000000000000000
4225.000000000000000
274625.000000000000000
17850625.000000000000000
1160290625.000000000000000
75418890625.000000000000000
4902227890625.000000000000000
318644812890625.000000000000000
20711912837890625.000000000000000
1346274334462890625.000000000000000
87507831740087890624.000000000000000
Run Code Online (Sandbox Code Playgroud)
我尝试了以下选项,但都是徒劳的
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 )
Run Code Online (Sandbox Code Playgroud)
我读了关于双重的帖子,但我没有得到解决方案.
C++本身不支持您尝试使用其标准数据类型.您需要至少104位来表示0到67 ^ 17之间的每个整数.
如果您觉得近似值对您来说足够好,那么您可以做的最好就是使用long double附带的电源功能版本:
#include <cmath>
Run Code Online (Sandbox Code Playgroud)
和
::std::cout << ::std::powl(65, 17) << ::std::endl;
Run Code Online (Sandbox Code Playgroud)
然而,由于65 ^ 17是奇数(最后一个十进制数字是5),因此您将无法获得正确的输出,因此需要具有至少104位尾数(long double通常没有)的浮点类型.
为了得到一个正确的答案,就需要使用更高的精度库,如GMP,它具有可容纳比你reqire的104位方式更多类型,并提供像自己的,快速的幂函数此.