1

我们正在编写软件,对具有 8 个固定十进制数字(后面的 8 个十进制数字.)的数字进行算术运算。

我们曾多次被内置浮点类型的有限精度所困扰double,主要是在相等比较(在小数点后第 17 位附近失败)。所以我们尝试转向一些固定精度的十进制类型。

从它的文档来看,cpp_dec_float应该是这样一种类型。所以我们using Decimal = doubleusing Decimal = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<8>>;

如果我们从字符串实例化,一切都会正常工作Decimal,但是当它从浮点文字实例化时会出现复杂情况:

assert(Decimal{0.001} == Decimal{"0.001"});

上面的断言失败了,因为左侧的 Decimal 实例似乎带有用于初始化它的文字的不精确表示,即使这个 epsilon 远远超出了所要求的精度 8

有没有办法获得“在实例化时截断”行为,所以上述断言得到满足?(理想情况下,该解决方案不需要触摸发生此类实例化的所有调用站点)

4

1 回答 1

0

这或许可以解释:

0.001 as a 32 bit float is exactly:
0.0009999999310821295
    12345678 are the 8 digits of accuracy
0.0009999999 is 0.001 as a 32 bit float rounded to the 8 digits of accuracy
0.0010000000 is 0.001 truely ecarately 

VS 7 bits of accuracy:
0.0009999999310821295
    1234567
0.001000000
0.001000000
于 2021-08-11T11:49:17.183 回答