【问题标题】:Is std::log2() an extension or C++ standard?std::log2() 是扩展还是 C++ 标准?
【发布时间】:2014-03-13 19:12:45
【问题描述】:

gcc (4.8.1) 和 clang (3.4) 编译我的 C++ 程序,它使用std::log2(x)。这个标准符合吗?

【问题讨论】:

  • 为什么不应该呢?谷歌搜索此函数显示 it's part of the C++ standard library 自 C++11 以来。如果它不是标准库的一部分,则将其添加到 std 命名空间将是未定义的行为。换句话说,标准库没有“扩展”之类的东西,谈到std 命名空间。
  • @leemes 一个符合要求的实现不允许在任何标准头文件中添加名称到std 命名空间。一个简单的原因是,如果foo 未定义为标准库的一部分,则允许用户在包含标准头文件之前将foo 定义为宏。如果标头随后尝试将foo 定义为(例如)函数,则宏将被展开,并且有效的程序将被拒绝。
  • @hvd 我知道...我不知道你为什么这么说。您是想将其添加到我的评论中,还是您误解了我想说的内容? ;) 我的观点是:因为不允许向std 添加东西,所以没有标准库的“扩展”之类的东西,例如在 C++11 之前添加的log2。跨度>
  • @leemes 我想我误解了你的评论。 “将其添加到 std 命名空间将是未定义的行为”,因为“程序不允许定义自己的 std::log2,因此如果实现这样做,就不会有冲突”

标签: c++ math c++11


【解决方案1】:

自 C++11 起,它现在包含在 <cmath> 标头中。

您可以在这里找到更多信息:std::log2

【讨论】:

  • 我在看这个网站,当搜索std::log2log2时,它的搜索功能没有(而且仍然没有)出现这个页面:-(跨度>
  • @Walter 很奇怪。感谢您接受答案。
【解决方案2】:

如果您使用的是没有此功能的早期 C++ 编译器,您可以使用log(x) / log(2.0)

【讨论】:

  • 是的,我知道,这通常会调用两次std::log()
  • @Walter 您始终可以为log(2.0) 使用硬编码常量,因为它永远不会改变。 0.693147180559945309 应该可以工作。
  • log2 对 2 的幂有特殊处理吗?我遇到了 log(x) / log(2.0) 的浮点错误,但是当我使用 log2 时它们解决了。
  • @SapphireSun 我怀疑它对待 2 的幂的方式与任何其他输入不同,但它可能有一个不同的算法。不查看库的实现是不可能知道的。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2012-07-05
  • 2012-01-05
  • 2013-08-08
  • 2015-11-06
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多