Python和/或C/C++中的高精度算法

2024-06-01 02:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

摘要:对于非常高精度的算术运算,哪个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能够更准确地完成这项工作?在


Tags: 函数inforobject分数hmsmsint
2条回答

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

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

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

应该是

^{pr2}$

此外,在代码中使用浮点字面值并将其转换为Decimal,这是个坏主意。这将首先将文字数字四舍五入到浮点精度。稍后对Decimal的转换无法恢复丢失的精度。试试看

d = decimal.Decimal

并且只使用整数文本(只需删除.0部分)。在

相关问题 更多 >