我正在使用Thinkpad T430在Debian 8中使用gcc 4.9.2。
我的部分代码使用以下函数:
long double LF_NormalizationFactor(int total_number_of_nodes,double alpha)
{
long double sum;
int maximum_distance;
if( (total_number_of_nodes % 2) == 0 )
{
maximum_distance = total_number_of_nodes/2;
sum = 2/pow(maximum_distance,alpha);
maximum_distance = maximum_distance - 1;
while( maximum_distance != 0)
{
sum = sum + 2/pow(maximum_distance,alpha);
maximum_distance = maximum_distance - 1;
}
}
else
{
maximum_distance = total_number_of_nodes/2;
sum = 2/pow(maximum_distance,alpha);
maximum_distance = maximum_distance - 1;
while( maximum_distance != 0)
{
sum = sum + 2/pow(maximum_distance,alpha);
maximum_distance = maximum_distance - 1;
}
}
return sum;
}
返回使用函数pow()计算的值。
问题是我需要将精度提高到20位小数,因为简而言之,我必须计算10 ^ -19的变化。
事情是,在经过一些研究和谷歌之后,我得出的结论是,pow()按原样只能提供最多15位小数。
示例:
total_number_of_nodes = 40 alpha = 1.50
返回:2.000000000000001776
(我需要2.000000000000000000)
有什么建议吗?
谢谢
答案 0 :(得分:2)
您的结论是正确的,pow()
是双精度函数,而不是长双精度(扩展)精度函数。 pow应该有一个很长的双版本,通常是powl()
。这应该给你19个数字,边缘log10(2 ^ 64)〜= 19.266。
Example runs using powl:
total_number_of_nodes = 2 alpha = 1.50
return: 2.000000000000000000
total_number_of_nodes = 40 alpha = 1.50
return: 4.341364142887200054
为什么来自问题的示例代码对于total_number_of_nodes是偶数还是奇数?