想象一下我有
>>> a = 725692137865927813642341235.00
如果我这样做
>>> sum = a + 1
之后
>>> sum == a
True
这是因为a大于某个阈值。
是否有像logsumexp
这样的技巧来执行此操作?
PS: a
是np.float64
。
答案 0 :(得分:2)
如果a
必须具体为float
类型,否则不可能。{p>事实上,不精确性要大得多:
>>> a = 725692137865927813642341235.00
>>> a + 10000 == a
True
但是,还有其他数据类型可用于表示(几乎)任意精度decimal
值或fractions
。
>>> d = decimal.Decimal(a)
>>> d + 1 == d
False
>>> f = fractions.Fraction(a)
>>> f + 1 == f
False
(注意:当然,执行Decimal(a)
或Fraction(a)
并没有神奇地恢复已经丢失的a
精度;如果你想保留它,你应该将完整值传递给一个字符串。)
答案 1 :(得分:2)
0)import decimal
1)设置decimal.getcontext()
(.prec
属性)的适当精度
2)声明为 decimal.Decimal()
实例
>>> import decimal
>>> decimal.getcontext().prec
28
>>> decimal.getcontext().prec = 300
>>> dec_a = decimal.Decimal( '725692137865927813642341235.0' )
很高兴将十进制模块用于极其扩展的数值精度求解器。
十进制模块具有非常强大的上下文方法,可以保留decimal
- 模块的优势 .add()
, .subtract()
, .multiply()
, .fma()
, .power()
以便确实构建差不多 - 无限精度求解器方法......
绝对值得掌握这些decimal.getcontext()
方法 - 你的求解器会在精确和未降级的收敛水平上进入另一个联盟。
答案 2 :(得分:0)
将a除以100,000然后加1然后再次将其重新计算? 例如
a=725692137865927813642341235.00
a /= 100000
a += 0.00001
a *= 100000