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

摘要:哪种Python包或C-Library是高精度算术运算的最佳选择?

我有一些函数可以将小数天( 0.0-0.99999.. )转换为人类0.0-0.99999..格式(小时,分钟,秒;但更重要的是:毫秒,微秒,纳秒)。

转换是通过以下function完成的:(请注意,我还没有实现时区校正)

 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 float时:

 # Difference in-out: 7.1452704258900823e-06 (same) 

因此,我的问题是:哪个Python包或C-library能够更准确地执行此操作?

不同之处在于您的代码中存在错误,而不是由于任何准确性问题。 这条线

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

应该是这样的

 output += self.nanosecond / d(86400000000000) 

此外,在代码中使用浮点文字并将它们转换为Decimal是一个坏主意。 这将首先将文字数字舍入为浮点精度。 后来转换为Decimal无法恢复丢失的准确性。 尝试

 d = decimal.Decimal 

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

CTRL-F“库”那里: 任意精度算术

编辑:仅从c ++和python的链接库中提取(并删除一些,没有浮点数,但只有整数)

python

1) mpmath


C ++

1) apfloat

2) 基础一个数字类

3) bigfloat

4) lidia

5) mapm

6) MIRACL

7) NTL

8) ttmath