哪些编程语言支持任意精度算术?

时间:2020-03-06 14:49:03  来源:igfitidea点击:

哪种编程语言支持任意精度算术,我们能否举一个简短的示例说明如何打印任意数量的数字?

解决方案

Java本机可以使用BigDecimal进行bignum操作。 GMP是使用C / C ++的bignum的事实上的标准库。

Python具有这种能力。这里有一个很好的例子。

从文章:

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

另外,python快速入门教程讨论了任意精度:http://docs.python.org/lib/decimal-tutorial.html

并描述了getcontext:

the getcontext() function accesses the
  current context and allows the
  settings to be changed.

编辑:添加了对getcontext的说明。

在常见的Lisp中,

(format t "~D~%" (expt 7 77))

printf格式的"〜D〜%"为"%d \ n"。 Common Lisp内置了任意精度算法。

某些语言内置了这种支持。例如,查看Java中的java.math.BigDecimal或者Python中的decimal.Decimal。

其他语言经常具有可用于提供此功能的库。例如,在C语言中,我们可以使用GMP或者其他选项。

本文的"任意精度软件"部分对选择进行了简要介绍。

许多人推荐使用Python的十进制模块,但是对于任何严重的数字用途,我建议使用mpmath而不是十进制。

方案(Lisp的变体)具有称为" bignum"的功能。在完整的语言环境和可嵌入的脚本选项中都有许多好的方案实现。
我可以保证的一些

MitScheme(也称为GNU方案)
PLTS方案
Chezscheme
Guile(也是gnu项目)
方案48

如果我们想在.NET世界中工作,则仍然可以使用java.math.BigDecimal类。只需添加对vjslib的引用(在框架中),然后就可以使用Java类。

很棒的是,它们可以在任何.NET语言中使用。例如在C#中:

using java.math;

    namespace MyNamespace
    {
        class Program
        {
            static void Main(string[] args)
            {
                BigDecimal bd = new BigDecimal("12345678901234567890.1234567890123456789");

                Console.WriteLine(bd.ToString());
            }
        }
    }

科宝

77 VALUE PIC S9(4)V9(4).

一个带符号的变量女巫4个小数。

PL / 1

DCL VALUE DEC FIXED (4,4);

:-)我不记得其他老东西了...

开个玩笑,如我的示例所示,我认为我们不应该根据单个功能来选择编程语言。几乎所有的体面语言和最新语言在某些专用的类中都支持固定的精度。

Mathematica。

N[Pi, 100]

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

mathematica不仅具有任意精度,而且默认情况下具有无限精度。它保持诸如1/3之类的有理数甚至涉及Sqrt [2]之类的表达式,它一直象征性地维护,直到我们要求数值近似值为止(该位数必须为小数点后一位)。

显然,Tcl也有它们,从8.5版开始,由LibTomMath提供:

http://wiki.tcl.tk/5193
http://www.tcl.tk/cgi-bin/tct/tip/237.html
http://math.libtomcrypt.com/

Smalltalk从一开始就支持任意精度的整数和分数。
请注意,gnu Smalltalk实现确实在后台使用GMP。
我还在为各种方言(Squeak / Pharo Visualworks和Dolphin)开发ArbitraryPrecisionFloat,请参见http://www.squeaksource.com/ArbitraryPrecisionFl.html