Python和/或C/C++中的高精度算术?
摘要:对于非常高精度的算术运算,哪种Python包或C库是最好的选择 我有一些函数可以将小数天转换为0.0-0.99999。。以人类可读的格式转换为小时、分钟、秒;但更重要的是:毫秒,微秒,纳秒 转换由以下函数完成: 注意,我还没有实现时区校正Python和/或C/C++中的高精度算术?,c++,python,c,math,precision,C++,Python,C,Math,Precision,摘要:对于非常高精度的算术运算,哪种Python包或C库是最好的选择 我有一些函数可以将小数天转换为0.0-0.99999。。以人类可读的格式转换为小时、分钟、秒;但更重要的是:毫秒,微秒,纳秒 转换由以下函数完成: 注意,我还没有实现时区校正 d = lambda x: decimal.Decimal(str(x)) cdef object fractional2hms(double fractional, double timezone): cdef object total, hm
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库能够更准确地做到这一点
<>编辑:只从C++和Python的链接库中提取,删除一些没有浮点数,但只有整数
蟒蛇
一,
c++
一,
二,
三,
四,
五,
六,
七,
8CTRL-F库:
<>编辑:只从C++和Python的链接库中提取,删除一些没有浮点数,但只有整数
蟒蛇
一,
c++
一,
二,
三,
四,
五,
六,
七,
8差异是由于代码中的错误,而不是由于任何准确性问题。线路
output += self.nanosecond * (d(8.64) * d(10)**d(-9))
应该是
output += self.nanosecond / d(86400000000000)
此外,在代码中使用浮点文本并将其转换为十进制是个坏主意。这将首先将文字数字四舍五入到浮点精度。后来的十进制转换无法恢复丢失的精度。试一试
d = decimal.Decimal
只使用整数文本,只需删除.0部分。差异是由于代码中存在错误,而不是由于任何准确性问题。线路
output += self.nanosecond * (d(8.64) * d(10)**d(-9))
应该是
output += self.nanosecond / d(86400000000000)
此外,在代码中使用浮点文本并将其转换为十进制是个坏主意。这将首先将文字数字四舍五入到浮点精度。后来的十进制转换无法恢复丢失的精度。试一试
d = decimal.Decimal
只使用整型文字只需删除.0部分。@Izz add Din Ruhulessin,答案是有用的,你不这么认为吗?如果没有人建议某个特定的库或说哪个更好,那么你要么随机选择,要么更精确地查找链接。嗨,Max,谢谢你的回答。重新阅读我的评论,我的结论是,它比我预期的更具敌意。如果我冒犯了你,我向你道歉。我把它放在你的编辑之前;您编辑的答案缩小了搜索范围。@Izz add Din Ruhulessin,答案可能有用,您不这么认为吗?如果没有人建议某个特定的库或说哪个更好,那么你要么随机选择,要么更精确地查找链接。嗨,Max,谢谢你的回答。重新阅读我的评论,我的结论是,它比我预期的更具敌意。如果我冒犯了你,我向你道歉。我把它放在你的编辑之前;你编辑的答案缩小了搜索范围。这是什么语言?cdef对象分馏L2HMS…:在我看来不像Python。但不管怎样:为什么一开始是双精度的,后来才转换成十进制?如果精度有问题,你应该从小数开始,永远不要离开那个领域。@Tim:是的,是Cython www.Cython.org这是什么语言?cdef对象分馏L2HMS…:在我看来不像Python。但不管怎样:为什么一开始是双精度的,后来才转换成十进制?如果精度有问题,你应该从小数开始,永远不要离开那个领域。@Tim:是的,是Cython www.Cython.org谢谢!当然应该是8.64*10*9。事实上,使用整数是一个更明智的解决方案。谢谢!当然应该是8.64*10*9。事实上,使用整数是一个更明智的解决方案。