Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和/或C/C++中的高精度算术?_C++_Python_C_Math_Precision - Fatal编程技术网

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

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

摘要:对于非常高精度的算术运算,哪种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库能够更准确地做到这一点

<>编辑:只从C++和Python的链接库中提取,删除一些没有浮点数,但只有整数

蟒蛇

一,

c++

一,

二,

三,

四,

五,

六,

七,

8

CTRL-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。事实上,使用整数是一个更明智的解决方案。