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

标签 c precision numerical-methods pow

我正在 Debian 8 中通过 Thinkpad T430 使用 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 位。

示例:

节点总数 = 40 阿尔法 = 1.50

返回:2.000000000000001776

(我需要 2.000000000000000000)

有什么建议吗?

谢谢

最佳答案

你的结论是正确的,pow()是一个 double 函数,而不是一个长双(扩展)精度函数。 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 偶数或奇数是相同的?

关于c - 对于 C 中的 pow() 等函数,将精度提高到小数点后 20 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42738714/

相关文章:

Matlab单双转换错误

python - 关于 Gmsh Python API 的问题

c - 如何从上到下打印链表节点

c - 必须将函数 sscanf 分配给变量,否则会出现奇怪的行为

java - Java 和 C# 之间 double 精度的差异

c++ - 以数值稳健的方式测试三个点的共线性

python - 四阶龙格-库塔

c - 为什么 MAP_GROWSDOWN 映射不增长?

c - 关于C中数组的各种问题

python - Numpy:dot(a,b) 和 (a*b).sum() 之间的区别