自定义Boost Multiprecision中的指数位数

时间:2018-08-07 17:21:11

标签: c++ boost-serialization boost-multiprecision

我们刚刚迁移到Visual Studio 2017,由于TM prefix,使用std::scientific的双精度值的序列化输出不再在指数中携带两位,而是只携带一位。

 BEOFRE: 5.49000000000000000e+002
 NOW   : 5.49000000000000000e+02

我们使用boost::serialization序列化为XML。

我们本来打算切换到boost::multiprecision来处理更大的数字,但仍然必须使用指数中的数字来解决此问题。

有什么办法可以回到旧的符号“ e + 002”,甚至可以用boost::multiprecision对其进行自定义?

1 个答案:

答案 0 :(得分:0)

在阅读相关章节时,似乎_set_output_format而不是_TWO_DIGIT_EXPONENT可能会产生旧的行为?

  

指数格式%e和%E格式说明符将浮点数格式化为十进制尾数和指数。在某些情况下,%g和%G格式说明符还会以这种格式格式化数字。在以前的版本中,CRT始终会生成具有三位数指数的字符串。例如,printf(“%e \ n”,1.0)将输出1.000000e + 000。这是不正确的:C要求,如果指数只能用一位或两位数字表示,那么只能打印两位数字。

     

在Visual Studio 2005 中,添加了一个全局一致性开关: _set_output_format 。程序可以使用参数 _TWO_DIGIT_EXPONENT 调用此函数,以启用一致的指数打印。 默认 行为已更改为符合标准的指数打印模式。