【问题标题】:constexpr exp, log, powconstexpr exp、log、pow
【发布时间】:2018-11-01 19:54:35
【问题描述】:

我想以可移植的方式使用标准<cmath> 函数的constexpr 版本,例如explogpow。我目前有一个不可移植的解决方案g++ treats these functions as constexpr - a non-compliant extension of C++,但我担心可移植性和面向未来(我想有一天这个扩展可能会从g++ 中删除)。

我对这些函数的constexpr 版本感兴趣,而不是模板元程序——我希望在编译时和运行时都可以使用相同的功能。我不需要 C 兼容性,但我确实需要快速实现 - 诸如泰勒级数展开之类的幼稚实现太慢了。

如何实现这些功能?我对@9​​87654334@、logpow特别感兴趣

我从研究中学到的一些相关的东西

  • 这些函数的标准兼容版本在技术上不是 constexpr,因为它们必须具有副作用(例如设置 errno)以保持 C 兼容性
  • 在 C++11 中,允许实现使这些函数 constexpr,但在 C++14 中,这是禁止的(根据 the first answer to this questionthe answer to this question)。这是我担心在g++ 的未来版本中这些功能可能不是constexpr 的部分原因
  • g++对每个数学函数foo的实现只是调用了一个内置函数__builtin_foo,它被视为constexpr。我也许可以开始调用__builtin_foo 函数而不是foo 函数——即使相应的foo 函数符合要求,这些函数在g++ 的未来版本中可能仍然是constexpr——但这只会有助于未来——打样,而不是便携性。

【问题讨论】:

  • 我的问题更具体——我想要 constexpr 实现,因为我想要在编译时和运行时都具有完全相同的功能。链接问题的公认答案是一个模板元程序,在这里不起作用。
  • “我希望在编译时和运行时都可以使用相同的功能。” - 运行时和编译时函数需要同名吗?如果有,为什么?
  • @DavisHerring 对于内置运算符 + - * / 也是如此,但标准允许将它们评估为 constexpr
  • @user1476176:是的:那个问题(以及要创建constexpr 的函数)是under discussion
  • 您实现 constexpr exp 的方式与实现非 constexpr exp 的方式相同,或者可能采用更复杂的方式。如何在 C++ 中实现快速可移植精确exp?这不是一个可能有单一简明权威答案的问题。太宽泛了!

标签: c++ c++11 language-lawyer constexpr


【解决方案1】:

你看过Sprout的实现吗?

Sprout 是仅包含标头的库,提供基于 C++11/14 constexpr 的容器、算法、随机数、解析、光线追踪、合成器等。

https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/math

【讨论】:

  • 偶尔我觉得我很聪明,是个不错的程序员。然后我看到像发芽一样的东西,我完全谦卑了。
【解决方案2】:

查看gcem,它提供了编译时数学函数。它们可以像 std 中的那样调用,但使用 gcem 前缀。

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2016-02-29
    相关资源
    最近更新 更多