我尝试使用GMP(GNU多精度算术库)来改进c ++程序。
有一个计数器变量,通过计算double类型的结果会定期增加。 添加发生在ISR(中断服务程序)中,因为它应该很快。
到目前为止,计数器变量的类型为double,导致出现问题。 一些设备(运行多年)达到了每个添加都属于吸收的程度,因此不再发生任何事情。 其他设备已经开始丢弃较小的添加物。
因为现在是时候通过使用mpf_class来改进它了。 但是为了正确设置mpf_class的大小,我需要知道ε(epsilon)。
我的问题是:我如何计算mpf_class对象的epsilon?
这个计算的例子(c ++)会很棒。
答案 0 :(得分:0)
GMP中的mpf类型不提供精确的基数-2表示。请求的精度由基础数组元素中的位数向上舍入,然后添加至少一个附加元素。如果在典型的32位系统上请求精度为53,则实际值将在65到96位之间计算。 (从技术上讲,mpf类型在这种情况下使用基数2 ^ 32算法。)
我建议改为查看MPFR(带舍入的多精度浮点数)库。它使用GMP库进行底层计算,但提供了更可预测的行为。 GMP文档中的注释建议使用MPFR。