C# 失去精度从而使等式结果为 0
C# losing precision thus making equation result 0
我的精度有问题。我将许多非常低的数字(例如 0.000001
)彼此相乘很多次(有时在 500-1000
左右),因此我失去了精度。我的数字在 double
中(也在字典中)。
有办法解决这个问题吗?
这是代码:
foreach (var word in fileDictionary)
{
dictionaryTotal.TryGetValue(word.Key, out percent);
temp = percent;
A *= temp;
B *= (1 - temp);
}
A/B
在此示例中变为 0.0
。
您可以使用对数,然后根据需要处理结果。
foreach (var word in fileDictionary)
{
dictionaryTotal.TryGetValue(word.Key, out percent);
temp = percent;
A += Math.Log10(temp);
B += Math.Log10(1 - temp);
}
然后您可以对生成的对数进行运算,而不是对生成的数字进行运算。
如果您希望最终 A/B 结果超出双倍幅度范围,最好的解决方案是使用 .
中建议的对数
如果temp
变化,你不需要A或B,最终的A/B结果应该是double range,如果不是可以当成0,你可以通过直接计算比率来得到它:
ratio = ratio * temp / (1 - temp)
我的精度有问题。我将许多非常低的数字(例如 0.000001
)彼此相乘很多次(有时在 500-1000
左右),因此我失去了精度。我的数字在 double
中(也在字典中)。
有办法解决这个问题吗? 这是代码:
foreach (var word in fileDictionary)
{
dictionaryTotal.TryGetValue(word.Key, out percent);
temp = percent;
A *= temp;
B *= (1 - temp);
}
A/B
在此示例中变为 0.0
。
您可以使用对数,然后根据需要处理结果。
foreach (var word in fileDictionary)
{
dictionaryTotal.TryGetValue(word.Key, out percent);
temp = percent;
A += Math.Log10(temp);
B += Math.Log10(1 - temp);
}
然后您可以对生成的对数进行运算,而不是对生成的数字进行运算。
如果您希望最终 A/B 结果超出双倍幅度范围,最好的解决方案是使用
如果temp
变化,你不需要A或B,最终的A/B结果应该是double range,如果不是可以当成0,你可以通过直接计算比率来得到它:
ratio = ratio * temp / (1 - temp)