3

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

4

6 回答 6

4

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

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

于 2009-06-17T03:47:25.707 回答
3

如果您真的是指无限精度,则有两种选择:

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

  • 象征性地进行计算。准确地表示整数、有理数、根等。如果您想确定是否相等,则需要这样做,但效率也很低,并且仅限于特殊情况。

于 2009-06-17T07:02:58.377 回答
1

没有实现具有无限精度的数学库。这是不可能的。除了分数之外,数字 1/3 不能用有限位数表示。像 pi 和 e 这样的超越数不能以任何方式完全表示。

另一方面,可以创建高精度的数学。只需为浮点值的尾数分配足够的位即可。

于 2009-06-17T03:41:54.237 回答
1

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

一些例子:

  • 整数在加法和乘法下是封闭的。

  • 有理数在除法下也是封闭的,除了零的特殊情况。可以表示为一对整数。另请参见GMP 中的有理数函数。例如 1.1 = 11/10,可以表示为 (11, 10)。

  • 一种在平方根下也是封闭的数字类型。

于 2009-06-17T04:44:36.687 回答
1

您还可以用十进制表示数字并进行十进制算术。底层表示是二进制的,因为每个数字都用二进制代码表示。每个数字——无论是在小数点的左边还是右边——都被视为一个整数。然后“手动”逐位进行算术运算。

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

于 2009-06-17T13:50:07.840 回答
-1

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

于 2009-06-17T03:48:59.607 回答