【发布时间】:2010-11-02 22:27:12
【问题描述】:
在 C++ 标准库中,我发现只有一个浮点日志方法。现在我使用 log 来查找二叉树 (floor(2log(index))) 中索引的级别。
代码(C++):
int targetlevel = int(log(index)/log(2));
恐怕对于某些边缘元素(值为 2^n 的元素),log 将返回 n-1.999999999999 而不是 n.0。这种恐惧正确吗?如何修改我的陈述,使其始终返回正确答案?
【问题讨论】:
-
我不明白这个问题。为什么它会返回 n - 1,9(9)?
-
因为并非所有整数都可以精确地存储为浮点数。如果 7 不合适,它将被存储为 7.000001 或 6.999999 例如。
-
是的,我知道。但是这个 1,9(9) 是从哪里来的呢?也许您可以使用 重新格式化问题,将 用于较高的索引,将 用于较低的索引?
-
任何整数都可以精确地存储在浮点数中。但是,log() 函数不一定精确,即使它是 log(2),对于自然对数或以 10 为底的函数都是不合理的,因此没有理由期望得到精确的结果。鉴于无法保证确切的结果,担心确切的边界条件是有道理的。
-
你必须有相当大的整数,可能是 2^exponentsize 才能精确表示。如果您在这种情况下失去精度,那是因为 log(2) 无法准确表示。你会只为 2^n 调用这个方法吗?如果是这样,您可以四舍五入到最接近的整数(或只使用接受的答案)
标签: c++ floating-accuracy logarithm