将 C 中的 pow() 等函数的精度提高到小数点后 20 位

Increase precision up to 20 decimal places for a function like pow() in C

我正在通过 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;
}

其中return是用函数 pow() 计算的值。

问题是我需要将精度提高到小数点后 20 位,因为简而言之,我必须计算 10^-19 的变化。

问题是,经过这里和 google 的一些研究后,我得出的结论是 pow() 按原样只给出最多 15 位小数。

示例:

total_number_of_nodes = 40 阿尔法 = 1.50

return: 2.000000000000001776

(我需要 2.000000000000000000)

有什么建议吗?

谢谢

你的结论是正确的,pow()是双精度函数,不是长双精度(扩展)函数。 pow 应该有一个 long double 版本,通常是 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 偶数或奇数问题中的示例代码相同?