相关疑难解决方法(0)

Constexpr数学函数

从这个页面中可以看出,c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以.所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr.对于像sqrt我这样的函数来说,两个人可能会编写我自己的constexpr,但是像sin或cos这样的东西会比较棘手,所以它就在那里.

c++ cmath constexpr c++11

56
推荐指数
3
解决办法
1万
查看次数

使用pow(x,2)代替x*x,x double是否有任何优势?

使用此代码有什么好处

double x;
double square = pow(x,2);
Run Code Online (Sandbox Code Playgroud)

而不是这个?

double x;
double square = x*x;
Run Code Online (Sandbox Code Playgroud)

我更喜欢x*x并且查看我的实现(Microsoft)我发现pow没有优势,因为x*x比特定方形情况下的pow更简单.

有什么特别的情况,战俘优越吗?

c++ math floating-point

44
推荐指数
7
解决办法
5万
查看次数

在C++ 11中,sqrt被定义为constexpr?

在C++ 11中std::sqrt定义为constexpr,即它可以合法地从其他constexpr函数或编译时上下文中使用,如数组大小或模板参数吗?g ++似乎允许它(使用-std=c++0x),但我不确定我是否可以将其视为权威,因为c ++ 0x/c ++ 11支持仍然不完整.我似乎无法在互联网上找到任何东西的事实让我不确定.

看起来这应该是人们可以轻易找到使用谷歌的东西,但我已经尝试过(现在40分钟......)并且找不到任何东西.我可以找到几个建议,将constexpr添加到标准库的各个部分(例如这个),但没有关于sqrt或其他数学函数.

c++ constexpr c++11

39
推荐指数
6
解决办法
1万
查看次数

它是一个符合标准的编译器扩展,将非constexpr标准库函数视为constexpr吗?

gcc 在没有警告的情况下编译以下代码:

#include <cmath>

struct foo {
  static constexpr double a = std::cos(3.);
  static constexpr double c = std::exp(3.);
  static constexpr double d = std::log(3.);
  static constexpr double e1 = std::asin(1.);
  static constexpr double h = std::sqrt(.1);
  static constexpr double p = std::pow(1.3,-0.75);
};

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

的上面使用的标准库函数都不是constexpr功能,我们允许使用它们,其中一个常量表达式从两个需要草案C++ 11标准草案C++ 14标准7.1.5 [dcl.constexpr] :

[...]如果它是由构造函数调用初始化的,那么该调用应该是一个常量表达式(5.19).否则,或者如果在引用声明中使用constexpr说明符,则其初始值设定项中出现的每个完整表达式都应为常量表达式.[...]

即使使用-std=c++14 -pedantic-std=c++11 -pedantic没有生成警告(请参见实时).使用-fno-builtin产生错误(参见实时),表明这些标准库函数的内置版本被视为constexpr

虽然 …

c++ gcc language-lawyer c++11 c++14

38
推荐指数
1
解决办法
2952
查看次数

constexpr exp,log,pow

我想使用constexpr的标准版<cmath>一样的功能exp,log,pow在便携方式.我目前有一个非便携式解决方案g++将这些功能视为constexpr- 不兼容C++的扩展,但我担心可移植性和面向未来(我想这个扩展可能有一天会被删除g++).

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

我该如何实现这些功能?我在特别感兴趣exp,logpow

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

  • 这些功能的标准兼容版本在技术上并不是constexpr因为它们必须具有副作用(例如设置errno)以保持C兼容性
  • 在C++ 11,一种实现被允许进行这些功能constexpr,但作为C++ 14,这是禁止的(每个第一回答这个问题回答这个问题).这是我担心函数可能不会出现constexpr在以后版本中的部分原因g++
  • g++每个数学函数的实现foo只调用一个内置函数__builtin_foo,它被视为constexpr.我或许可以开始调用__builtin_foo函数而不是foo函数 - 即使相应的函数符合要求,这些函数仍可能保留constexpr在未来版本中- 但这只会有助于未来验证,而不是可移植性.g++foo

c++ language-lawyer constexpr c++11

18
推荐指数
2
解决办法
3374
查看次数

为什么我可以在constexpr函数中调用非constexpr函数?

请考虑以下代码:

#include <stdio.h>

constexpr int f()
{
    return printf("a side effect!\n");
}

int main()
{
    char a[f()];
    printf("%zd\n", sizeof a);
}
Run Code Online (Sandbox Code Playgroud)

我本来期望编译器抱怨printf内部的调用f,因为f应该是constexpr,但printf不是.为什么程序编译和打印15

c++ gcc side-effects constexpr c++11

16
推荐指数
1
解决办法
5240
查看次数