哪些编程语言支持任意精度算术,并且你能给出一个简短的例子来打印任意数量的数字吗?
哪些编程语言支持任意精度算术,并且你能给出一个简短的例子来打印任意数量的数字吗?
一些语言内置了这种支持。例如,看看 Java 中的 java.math.BigDecimal,或者 Python 中的 decimal.Decimal。
其他语言通常有可用的库来提供此功能。例如,在 C 语言中,您可以使用 GMP 或其他选项。
这篇文章 的“任意精度软件”部分提供了一个很好的选择概述。
Mathematica.
->Mathematica。
N[Pi, 100]
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
Mathematica不仅具有任意精度,而且默认情况下它具有无限精度。它将像1/3这样的东西保持为有理数,甚至涉及Sqrt [2]之类的表达式,它会在你要求进行数字近似之前维护符号性,你可以将其近似到任意小数位数。
Smalltalk从一开始就支持任意精度整数和分数。 需要注意的是gnu Smalltalk实现在底层使用了GMP。 我也正在为各种方言(Squeak/Pharo Visualworks和Dolphin)开发ArbitraryPrecisionFloat,请参见http://www.squeaksource.com/ArbitraryPrecisionFl.html
(format t "~D~%" (expt 7 77))
from math import log as _flog
from decimal import getcontext, Decimal
def log(x):
if x < 0:
return Decimal("NaN")
if x == 0:
return Decimal("-inf")
getcontext().prec += 3
eps = Decimal("10")**(-getcontext().prec+2)
# A good initial estimate is needed
r = Decimal(repr(_flog(float(x))))
while 1:
r2 = r - 1 + x/exp(r)
if abs(r2-r) < eps:
break
else:
r = r2
getcontext().prec -= 3
return +r
COBOL
77 VALUE PIC S9(4)V9(4).
一个带有4位小数的有符号变量。
PL/1
DCL VALUE DEC FIXED (4,4);
:-) 我记不得其他旧的东西了...
开玩笑的,正如我的例子所示,我认为你不应该仅根据单一功能选择编程语言。几乎所有好的和最新的编程语言都支持在一些专门的类中支持固定精度。
因此,我的观点是,如果考虑编写数学例程所需的工作量,更不用说所有符号计算都已成熟,那么通过在REDUCE中完成大部分数学部分,可以节省大量时间(几十年),特别是考虑到它已经被专业数学家测试和调试了长时间,用于在旧时代超级计算机上进行符号计算以完成真正的专业任务,并且在现代低端计算机上运行得非常快。与至少一个商业软件包不同,它从未崩溃过,我不想在这里透露其名称。
http://www.reduce-algebra.com/
为了举例说明,在实践中,符号计算是必不可少的。我举一个通过矩阵求逆解决线性方程组的例子。要求一个矩阵的逆矩阵,需要找到行列式。直接由 CPU 支持的浮点类型所进行的四舍五入可能会将一个在理论上有逆矩阵的矩阵变成没有逆矩阵的矩阵。这反过来会引入一种情况,即大多数时候软件可能运行得很好,但如果数据有点“不幸”,那么应用程序就会崩溃,尽管从算法上讲,软件没有任何问题,除了浮点数的舍入之外。Scheme(一种Lisp的变体)具有称为“bignum”的功能。现在有许多优秀的Scheme实现,包括完整的语言环境和可嵌入的脚本选项。
以下是我可以保证的几个实现:
在PHP中,你可以使用BCMath。你不需要加载任何dll文件或编译任何模块。该函数支持任意大小和精度的数字,以字符串形式表示。
<?php
$a = '1.234';
$b = '5';
echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.2340
?>
BigDecimal
是某人使用该语言实现自己的任意精度算术类/库。但我怀疑几乎任何非平凡的语言都会有这样的库可用。这不是问题所问的。 - aroth