1

我花了一天的大部分时间来跟踪这个例子中的问题:

#include <boost/multiprecision/cpp_dec_float.hpp>

#include <iostream>

int main () 
{
  
  typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>> float_t;
  //typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::expression_template_option::et_off> float_t; // <--- this works ok, too!

  float_t dependency = 2.0;

  auto const val = dependency / 2;
  //float_t const val = dependency / 2; // <--- this works ok!


  std::cout << val << std::endl;
  dependency = val - 2;
  std::cout << val << std::endl;
  dependency = val - 2;
  std::cout << val << std::endl;
  dependency = val - 2;

  return 0;
}

输出

1
-0.5
-1.25

似乎val对依赖项的依赖违反了 const 承诺。

  1. 将auto const更改为float_t const可以解决问题。

  2. 使用cpp_bin_float解决了这个问题

  3. 随机怀疑,禁用表达式模板可以解决问题

这发生在多个 VS 版本、mingw8.1 和 Coliru 上。

任何更熟悉内部运作的人可以解释发生了什么吗?

4

0 回答 0