摘要:对于非常高精度的算术运算,哪个Python包或C-Library是最佳选择?
我有一些函数可以将分数天(0.0-0.99999..
)转换为人类可读的格式(小时、分钟、秒;但更重要的是:毫秒、微秒、纳秒)。在
转换由以下函数完成: (请注意,我还没有实现时区更正)
d = lambda x: decimal.Decimal(str(x))
cdef object fractional2hms(double fractional, double timezone):
cdef object total, hms, ms_mult
cdef int i
hms = [0,0,0,0,0,0]
ms_mult = (d(3600000000000), d(60000000000), d(1000000000), d(1000000), d(1000), d(1))
# hms = [0,0,0,0,0]
total = d(fractional) * d(86400000000000)
for i in range(len(ms_mult)):
hms[i] = (total - (total % ms_mult[i])) / ms_mult[i]
total = d(total % ms_mult[i])
return ([int(x) for x in hms])
分数:
^{pr2}$但是,我的前后转换结果不准确:
jdatetime.DayTime.fromfractional(d(0.567784356873)).to_fractional()
Decimal('0.56779150214342592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592')
# Difference in-out: Decimal('0.000007145270')
当我更改d()
以返回常规Python浮点值时:
# Difference in-out: 7.1452704258900823e-06 (same)
因此,我的问题是:哪个Python包或C-library能够更准确地完成这项工作?在
CTRL-F“库”在那里:Arbitrary-precision_arithmetic
编辑:仅从c++和python的链接库中提取(并删除一些没有浮点数,只有整数的链接库)
python
1)mpmath
c++
1)apfloat
2)base one number class
3)bigfloat
4)lidia
5)mapm
6)MIRACL
7)NTL
8)ttmath
差异是由于代码中的一个错误,而不是由于任何准确性问题。线
应该是
^{pr2}$此外,在代码中使用浮点字面值并将其转换为
Decimal
,这是个坏主意。这将首先将文字数字四舍五入到浮点精度。稍后对Decimal
的转换无法恢复丢失的精度。试试看并且只使用整数文本(只需删除
.0
部分)。在相关问题 更多 >
编程相关推荐