对于像C

时间:2017-03-11 18:03:43

标签: c precision numerical-methods pow

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

有什么建议吗?

谢谢

1 个答案:

答案 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是偶数还是奇数?