Какие языки программирования поддерживают арифметику произвольной точности? - PullRequest
20 голосов
/ 27 сентября 2008

Какие языки программирования поддерживают арифметику произвольной точности, и не могли бы вы привести краткий пример того, как напечатать произвольное число цифр?

Ответы [ 16 ]

14 голосов
/ 27 сентября 2008

В некоторые языки встроена эта поддержка. Например, посмотрите на java.math.BigDecimal в Java или decimal.Decimal в Python.

На других языках часто есть библиотека для этой функции. Например, в C вы можете использовать GMP или другие параметры.

Раздел «Программное обеспечение с произвольной точностью» в этой статье дает краткое изложение ваших вариантов.

11 голосов
/ 02 октября 2008

Mathematica.

N[Pi, 100]

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

Mathematica не только имеет произвольную точность, но и по умолчанию имеет бесконечную точность. Он сохраняет такие вещи, как 1/3, как рациональные и даже выражения, включающие такие вещи, как Sqrt [2], он поддерживает символически до тех пор, пока вы не попросите числовое приближение, которое вы можете иметь с любым количеством десятичных знаков.

6 голосов
/ 12 ноября 2010

Smalltalk поддерживает произвольные целочисленные значения и дроби с самого начала. Обратите внимание, что реализация GNU Smalltalk использует GMP под капотом. Я также разрабатываю ArbitraryPrecisionFloat для различных диалектов (Squeak / Pharo Visualworks и Dolphin), см. http://www.squeaksource.com/ArbitraryPrecisionFl.html

6 голосов
/ 27 сентября 2008

В Common Lisp,

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

"~ D ~%" в формате printf будет "% d \ n". Арифметика произвольной точности встроена в Common Lisp.

5 голосов
/ 27 сентября 2008

Многие люди рекомендовали десятичный модуль Python, но я бы порекомендовал использовать mpmath вместо десятичного для любых серьезных числовых применений.

5 голосов
/ 27 сентября 2008

Питон обладает такой способностью. Вот отличный пример здесь .

Из статьи:

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:

функция getcontext () обращается к текущий контекст и позволяет настройки должны быть изменены.

Редактировать: Добавлено разъяснение по getcontext.

3 голосов
/ 25 октября 2011

В PHP у вас есть BCMath. Вам не нужно загружать какие-либо DLL или скомпилировать любой модуль. Поддерживает числа любого размера и точности, представленные в виде строки

<?php

$a = '1.234';
$b = '5';

echo bcadd($a, $b);     // 6
echo bcadd($a, $b, 4);  // 6.2340

?>
3 голосов
/ 08 июля 2011

Рубиновые целые числа и числа с плавающей точкой (математически: рациональные числа) по умолчанию не строго привязаны к классическим ограничениям, связанным с CPU. В Ruby целые числа и числа с плавающей точкой автоматически прозрачно переключаются на некоторые "типы bignum", если размер превышает максимум классических размеров.

Вероятно, кто-то хочет использовать некоторую разумно оптимизированную и «законченную», разнообразную математическую библиотеку, которая использует «bignums». Именно здесь программное обеспечение, подобное Mathematica, действительно сияет своими возможностями.

Начиная с 2011 года Mathematica чрезвычайно дорогая и ужасно ограничена с точки зрения взлома и повторной отправки, особенно если вы хотите отправить математическое программное обеспечение в качестве компонента небольшого, недорогого веб-приложения или проекта с открытым исходным кодом. , Если нужно сделать только грубое сокращение чисел, когда визуализация не требуется, то существует очень жизнеспособная альтернатива Mathematica и Maple. Альтернативой является система компьютерной алгебры REDUCE, основанная на Лиспе, с открытым исходным кодом, зрелая (на протяжении десятилетий) и находящаяся в стадии активной разработки (в 2011 году). Как и Mathematica, REDUCE использует символьные вычисления.

Для признания Mathematica я говорю, что с 2011 года мне кажется, что Mathematica является лучшим в интерактивных визуализациях, но я думаю, что с точки зрения программирования есть более удобные альтернативы, даже если Mathematica был открытым исходным кодом. проект. Мне кажется, что Mahtematica также немного медленный и не подходит для работы с огромными наборами данных. Мне кажется, что ниша Mathematica - это теоретическая математика, а не вычисление чисел в реальной жизни. С другой стороны, издатель Mathematica, Wolfram Research, размещает и поддерживает один из самых качественных, если не самый качественный, бесплатный в использовании справочный сайт по математике на планете Земля: http://mathworld.wolfram.com/ Система онлайн-документации, поставляемая в комплекте с Mathematica, также действительно хороша.

Говоря о скорости, стоит упомянуть, что REDUCE, как говорят, работает даже на маршрутизаторе Linux. Сам REDUCE написан на Лиспе, но поставляется с двумя собственными, конкретными реализациями Лисп. Один из Лиспов реализован на Java, а другой - на C. Они оба работают прилично, по крайней мере, с математической точки зрения. REDUCE имеет 2 режима: традиционный «математический режим» и «режим программистов», который обеспечивает полный доступ ко всем внутренним компонентам на языке, на котором REDUCE сам написан: Lisp.

Итак, мое мнение таково: если посмотреть на объем работы, который требуется для написания математических подпрограмм, не говоря уже о всех символических вычислениях, которые все являются ЗРЕЛЫМИ в REDUCE, то можно сэкономить огромное количество времени ( буквально десятилетия), выполняя большую часть математической части в REDUCE, особенно учитывая, что она была проверена и отлажена профессиональными математиками в течение длительного периода времени, использовалась для выполнения символических вычислений на суперкомпьютерах старой эпохи для реальных профессиональных задач и прекрасно работает действительно быстрый, на современных бюджетных компьютерах. Он также не разбился о меня, в отличие от хотя бы одного коммерческого пакета, который я не хочу называть здесь.

http://www.reduce -algebra.com /

Чтобы проиллюстрировать, где символические вычисления необходимы на практике, я привожу пример решения системы линейных уравнений с помощью инверсии матриц. Чтобы инвертировать матрицу, нужно найти определители. Округление, которое происходит с напрямую поддерживаемыми процессором типами с плавающей запятой, может отображать матрицу, которая теоретически имеет обратную, в матрицу, которая не имеет обратной. Это, в свою очередь, создает ситуацию, когда большую часть времени программное обеспечение может работать просто отлично, но если данные немного «неудачны», то происходит сбой приложения, несмотря на то, что в программном обеспечении нет ничего плохого в алгоритме, кроме округления чисел с плавающей точкой.

У рациональных чисел абсолютной точности есть серьезное ограничение. Чем больше вычислений выполняется с ними, тем больше памяти они потребляют. По состоянию на 2011 год я не знаю никаких решений этой проблемы, кроме как быть осторожным и отслеживать количество операций, которые были выполнены с числами, а затем округлять числа, чтобы сэкономить память, но нужно выполнить округление очень точный этап расчетов, чтобы избежать вышеупомянутых проблем. Если возможно, то округление должно быть выполнено в самом конце вычислений как самая последняя операция.

3 голосов
/ 27 сентября 2008

COBOL

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

знаковая переменная с 4 десятичными знаками.

PL / 1

DCL VALUE DEC FIXED (4,4);

:-) Я не могу вспомнить другие старые вещи ...

Помимо шуток, как показывает мой пример, я думаю, что вам не следует выбирать язык программирования в зависимости от одной функции. Практически all Достойный и недавний язык поддерживает фиксированную точность в некоторых специализированных классах.

3 голосов
/ 27 сентября 2008

Схема (разновидность lisp) имеет возможность, называемую «bignum». Есть много хороших реализаций схем, доступных как в полноязычных средах, так и встраиваемых скриптов несколько я могу поручиться за

MitScheme (также называемый схемой GNU) PLTScheme Chezscheme Guile (также проект GNU) Схема 48

...