constexpr exp,log,pow

时间:2018-05-22 23:52:22

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

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

我对这些函数的constexpr版本感兴趣,而不是模板元程序 - 我希望在编译时和运行时都能使用相同的功能。我不需要C兼容性,但我确实需要快速实现 - 像Taylor系列扩展这样的天真实现会太慢。

如何实施此类功能?我对explogpow

特别感兴趣

我从研究中学到的一些切向相关的事情

  • 这些功能的标准兼容版本在技术上不是constexpr,因为它们必须具有副作用(例如设置errno)以维持C兼容性
  • 在C ++ 11中,允许实现这些函数constexpr,但从C ++ 14开始,这是禁止的(每the first answer to this questionthe answer to this question)。这是我担心constexpr
  • 的未来版本中的功能可能不是g++的部分原因
  • g++每个数学函数foo的实现只调用内置函数__builtin_foo,该函数被视为constexpr。我或许可以开始调用__builtin_foo函数而不是foo函数 - 即使相应的constexpr函数是g++,这些函数在foo的未来版本中仍可能<bean name="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/hibernate_db" /> <property name="username" value="my_local_username" /> <property name="password" value="my_local_password" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="packagesToScan" value="com.fr.business.entites" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> 符合标准 - 但这只有助于未来验证,而不是便携性。

2 个答案:

答案 0 :(得分:2)

您曾经看过Sprout的实现吗?

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

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

答案 1 :(得分:2)

签出gcem,它提供了编译时数学函数。可以像std中的名称一样调用它们,但使用gcem前缀。