将 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 偶数或奇数问题中的示例代码相同?
我正在通过 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 偶数或奇数问题中的示例代码相同?