我正在 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/