摘要:对于非常高精度的算术运算,哪个Python软件包或C库是最佳选择?

我有一些函数可以将小数天(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])

和分数:
def to_fractional(self):
        output = (self.hour / d(24.0)) + (self.minute / d(1440.0))
        output += (self.second / d(86400.0)) + (self.millisecond / d(86400000.0))
        output += self.microsecond / d(86400000000.0)
        output += self.nanosecond * (d(8.64) * d(10)**d(-9))
        return output

我的来回转换结果不准确,但是:
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库能够更准确地做到这一点?

最佳答案

差异是由于您的代码中的错误,而不是由于任何准确性问题引起的。线

output += self.nanosecond * (d(8.64) * d(10)**d(-9))

应该是这样的
output += self.nanosecond / d(86400000000000)

此外,在代码中使用浮点文字并将其转换为Decimal是一个坏主意。这将首先将文字数字四舍五入到浮点精度。后来转换为Decimal不能恢复丢失的准确性。尝试
d = decimal.Decimal

并仅使用整数文字(只需删除.0部分)。

08-08 01:29
查看更多