如何实现具有无限精度的数学库?

时间:2009-06-17 03:38:54

标签: precision floating-accuracy

所以我知道浮点精度(以及1.1之类的东西不能用二进制来表示)以及所有这些,但我想知道:那么,数学相关的库如何实现无限精度?换句话说,你如何准确地用二进制表示1.1?只是一个简短的描述会很棒,我可以自己弄清楚确切的细节。谢谢。 :)

6 个答案:

答案 0 :(得分:4)

没有无限精度库,但有任意精度库。有关如何实现这些的详细信息,请阅读一些documentation: - )

要准确地以二进制表示1.1,不能正确指出浮点数。如果将整数部分(1)存储为整数,并将小数部分(.1)存储为另一个整数,则可以表示它,然后您需要创建逻辑来处理这些结构。或者,它可以存储为分数(11/10),分母和分子都存储为整数。

答案 1 :(得分:3)

如果你真的意味着无限精度,有两种选择:

  • 使用某种形式的延迟计算。然后你可以在执行计算之后询问一个数字以获得尽可能多的精度(因为它实际上只在那时才变得很懒)。缺点是这是非常低效的。您可以使用Haskell等语言,使用表示重叠的特殊数字系统来完成此操作,例如:基数2,数字为-1,0,1。通常的表示是不合适的,因为在1处你需要无限精度来决定输出0表示0.999 ...和1表示1.000 ...

  • 象征性地进行计算。完全代表整数,理性,根等。如果您想要确定相等性,那么这是必需的,但也非常低效且仅限于特殊情况。

答案 2 :(得分:1)

未实现具有无限精度的数学库。它无法完成。除了作为分数之外,数字1/3不能以有限数量的比特来表示。像pi和e这样的超越数字无法以任何方式完全表现出来。

另一方面,可以使用巨大精度创建数学库。这都是为浮点值的尾数分配足够的位。

答案 3 :(得分:1)

某些几何算法依赖于精确算术,因此如果您查看CGAL库,您会发现各种操作下“关闭”的各种精确数字类型。也就是说,无法使用支持的操作来生成无法准确表示的结果。

一些例子:

  • 整数在加法和乘法下关闭。

  • 除了零的特殊情况外,理性也在分割下关闭。可以表示为一对整数。另请参阅rational number functions in GMP。例如1.1 = 11/10,可以表示为(11,10)。

  • 也在平方根下关闭的数字类型。

答案 4 :(得分:1)

您也可以用十进制表示数字并进行十进制算术运算。在每个数字用二进制代码表示的意义上,底层表示是二进制的。每个数字 - 无论是小数点的左侧还是右侧 - 都被视为整数。算术然后逐个“手动”地完成。

基于十进制的库的一个例子是PHP中的BCMath。

答案 5 :(得分:-1)

当我们谈论浮点数和数字时,Pax完全就在这里,我相信有一个解决方案,但效率非常低。
您可以使用字符串来表示您的数字,字符串不会丢失精度 每当你有一个像“0.0001”+“0.1”的数字时,你迭代两个字符串并只将当前位置转换为int。
第1步:
0 + 0 = 0 - >转换为字符串并分配给数据[0] 第2步:
0 + 1 = 1 - >转换为字符串并分配给数据[1] 第3步:
iter> “0.1”.lenght() - >停止。