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

问题描述 投票:0回答:7

所以我知道浮点精度(以及像 1.1 这样的东西如何不能用二进制精确表达)等等,但我想知道:那么,数学相关的库如何实现无限精度?换句话说,例如,如何用二进制准确地表示 1.1?只要有一个简短的描述就很好了,我自己可以弄清楚具体的细节。谢谢。 :)

precision floating-accuracy
7个回答
4
投票

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

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


3
投票

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

  • 使用某种形式的惰性计算。然后,您可以在执行计算“之后”要求一个数字达到您想要的精度(因为它是惰性的,所以实际上只在那时才完成)。缺点是效率非常低。您可以使用 Haskell 等语言使用表示重叠的特殊数字系统来执行此操作,例如以 2 为基数,数字为 -1, 0, 1。通常的表示形式是不合适的,因为在 1 处,您需要无限的精度来决定输出 0 表示 0.999... 和 1 表示 1.000...

  • 进行符号计算。准确地表示整数、有理数、根等。如果你想决定平等,这是必要的,但效率也相当低,并且仅限于特殊情况。


1
投票

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

另一方面,可以创建具有巨大精度的数学库。这只是为浮点值的尾数分配足够的位的问题。


1
投票

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

一些例子:

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

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

  • 也是开平方根的数字类型。


1
投票

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

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


0
投票

如果只需要表示有理数,就用p/q即可,其中p、q是整数


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.