constexpr:浮点表示错误?

soc*_*tic 6 c++ constexpr c++11

我希望将常量从度数转换为弧度(在编译时),所以我选择使用constexpr.但是,我的程序不会编译,因此我尝试通过一些测试来调试问题.这些测试在编译期间继续产生错误.

当涉及许多有效数字时,该问题似乎与浮点算法相关.

我尝试了一个快速的谷歌搜索,我在Stroustrup的书中阅读了10.4节(常量表达式).任何帮助将不胜感激.我一定错过了一些明显的东西.

测试代码:

void testConstantExpressions() {

  constexpr double x0 = 1.0;
  constexpr double y0 = 2.0;
  constexpr double z0 = 4.0;
  constexpr double w0 = x0 / (y0 / z0);
  std::cout << w0 << std::endl;

  constexpr double x1 = 1.0;
  constexpr double y1 = 2.2;
  constexpr double z1 = 4.0;
  constexpr double w1 = x1 / (y1 / z1);
  std::cout << w1 << std::endl;

  constexpr double x2 = 1.0;
  constexpr double y2 = 4.0;
  constexpr double z2 = 2.3;
  constexpr double w2 = x2 / (y2 / z2);
  std::cout << w2 << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -Wall -c -g -O2 -std=c++11 -frounding-math  main.cpp -o main.o
main.cpp: In function ‘void testConstantExpressions()’:
main.cpp:30:32: error: ‘(1.0e+0 / 5.5000000000000004e-1)’ is not a constant expression
   constexpr double w1 = x1 / (y1 / z1);
                            ^
main.cpp:36:38: error: ‘(4.0e+0 / 2.2999999999999998e+0)’ is not a constant expression
   constexpr double w2 = x2 / (y2 / z2);
                                  ^
make: *** [main.o] Error 1
Run Code Online (Sandbox Code Playgroud)

Ala*_*kes 5

这是因为您指定了 -frounding-math。你告诉编译器你可以在运行时改变舍入模式,所以它不能在编译时舍入。你真的是故意的吗?

  • 也许您可以分离需要修改舍入模式的位,并以更正常的方式编译大部分程序? (2认同)