Какие языки программирования поддерживают произвольную арифметику точности и не могли бы вы дать короткий пример того, как печатать произвольное количество цифр?
Какие языки программирования поддерживают произвольную арифметику точности?
Ответ 1
Некоторые языки поддерживают эту поддержку. Например, посмотрите на java.math.BigDecimal на Java или decimal.Decimal в Python.
На других языках часто имеется библиотека для предоставления этой функции. Например, в C вы можете использовать GMP или другие параметры.
Раздел "Произвольное прецизионное программное обеспечение" в этой статье дает хорошее описание ваших вариантов.
Ответ 2
Mathematica.
N[Pi, 100]
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
Не только математика имеет произвольную точность, но по умолчанию имеет бесконечную точность. Он хранит такие вещи, как 1/3, как рациональные и даже выражения, включающие такие вещи, как Sqrt [2], оно символически сохраняется до тех пор, пока вы не попросите числовое приближение, которое вы можете иметь для любого количества десятичных знаков.
Ответ 3
У 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:
функция getcontext() обращается к текущего контекста и параметры, которые необходимо изменить.
Изменить: Добавлено разъяснение в getcontext.
Ответ 4
Многие люди рекомендовали десятичный модуль Python, но я бы рекомендовал использовать mpmath по десятичной для любых серьезных числовых целей.
Ответ 5
Smalltalk поддерживает произвольную точность целых чисел и фракций с самого начала. Обратите внимание, что реализация gnu Smalltalk использует GMP под капотом. Я также разрабатываю ArbitraryPrecisionFloat для различных диалектов (Squeak/Pharo Visualworks и Dolphin), см. http://www.squeaksource.com/ArbitraryPrecisionFl.html
Ответ 6
В Common Lisp,
(format t "~D~%" (expt 7 77))
"~ D ~%" в формате printf будет "% d\n". Произвольная арифметика точности встроена в Common Lisp.
Ответ 7
COBOL
77 VALUE PIC S9(4)V9(4).
подписанная переменная witch 4 десятичные числа.
PL/1
DCL VALUE DEC FIXED (4,4);
:-) Я не могу вспомнить другие старые вещи...
Анекдоты, как показывает мой пример, я думаю, что вы не должны выбирать язык программирования в зависимости от одной функции. Практически все приличные и свежие языки поддерживают фиксированную точность в некоторых выделенных классах.
Ответ 8
Целочисленные числа Ruby и числа с плавающей запятой (математически говоря: рациональные числа) по умолчанию не привязаны строго к классическим ограничениям, связанным с ЦП. В Ruby целые числа и поплавки автоматически, прозрачно, переключаются на некоторые "типы bignum", если размер превышает максимальный размер классических размеров.
Возможно, вы захотите использовать некоторую разумно оптимизированную и "полную", многообразную математическую библиотеку, которая использует "bignums". Именно здесь программное обеспечение, похожее на Mathematica, по-настоящему сияет своими возможностями.
По состоянию на 2011 год Mathematica чрезвычайно дорогой и ужасно ограничен с точки зрения взлома и переустановки, особенно, если вы хотите отправить математическое программное обеспечение как компонент небольшого, низкого ценового конца, веб-приложения или проекта с открытым исходным кодом, Если нужно сделать только хруст с числовым числом, где визуализация не требуется, то существует очень жизнеспособная альтернатива Mathematica и Maple. Альтернативой является компьютерная алгебраическая система REDUCE, которая основана на Lisp, с открытым исходным кодом и зрелой (на протяжении десятилетий) и находится в активной разработке (в 2011 году). Подобно Mathematica, REDUCE использует символический расчет.
Для признания Mathematica я говорю, что с 2011 года мне кажется, что Mathematica является лучшим при интерактивной визуализации, но я думаю, что с точки зрения программирования есть более удобные альтернативы, даже если Mathematica является открытым исходным кодом проект. Мне кажется, что Mahtematica также немного медленный и не подходит для работы с огромными наборами данных. Мне кажется, что ниша "Математики" - это теоретическая математика, а не реальное число хрустов. С другой стороны, издатель Mathematica, Wolfram Research, размещает и поддерживает одно из самых качественных, если не самых качественных, бесплатных в использовании, ориентированных на математику сайтов на планете Земля: http://mathworld.wolfram.com/ Система онлайн-документации, поставляемая вместе с Mathematica, также действительно хороша.
Говоря о скорости, стоит упомянуть, что REDUCE работает даже на маршрутизаторе Linux. Сам REDUCE написан в Lisp, но он поставляется с двумя его собственными, конкретными реализациями Lisp. Один из Lisps реализован на Java, а другой реализован в C. Оба они работают прилично, по крайней мере, с математической точки зрения. У REDUCE есть 2 режима: традиционный "математический режим" и "режим программистов", который позволяет получить полный доступ ко всем внутренним компонентам с помощью языка, на котором REDUCE записывается самостоятельно: Lisp.
Итак, я считаю, что если посмотреть на объем работы, который требуется для написания математических подпрограмм, не говоря уже о всех символических вычислениях, которые являются MATURE в REDUCE, тогда можно сэкономить огромное количество времени ( десятилетия, буквально), выполняя большую часть математической части в REDUCE, специально учитывая, что она была проверена и отлажена профессиональными математиками в течение длительного периода времени, используется для выполнения символических вычислений на суперкомпьютерах старой эры для реальных профессиональных задач и прекрасно работает, по-настоящему быстро, на современных компьютерах с низким уровнем доступа. И он не рухнул на меня, в отличие от хотя бы одного коммерческого пакета, который я не хочу здесь называть.
http://www.reduce-algebra.com/
Чтобы проиллюстрировать, где символический расчет является существенным на практике, я приведу пример решения системы линейных уравнений путем инверсии матрицы. Чтобы инвертировать матрицу, нужно найти детерминанты. Округление, которое имеет место с поддержкой типов с плавающей точкой с поддержкой непосредственно процессора, может отображать матрицу, теоретически имеющую обратную, к матрице, которая не имеет обратного. Это, в свою очередь, представляет собой ситуацию, когда большую часть времени программное обеспечение может работать нормально, но если данные немного "неудачны", то приложение падает, несмотря на то, что алгоритмически нет ничего плохого в программном обеспечении, кроме округления чисел с плавающей запятой.
Абсолютная точность рациональных чисел имеет серьезные ограничения. Чем больше вычислений выполняется с ними, тем больше памяти они потребляют. С 2011 года я не знаю никаких решений этой проблемы, кроме как быть осторожным и отслеживать количество операций, которые выполнялись с числами, а затем округлять числа, чтобы сохранить память, но нужно округлить очень точный этап расчетов, чтобы избежать вышеупомянутых проблем. Если возможно, то округление должно выполняться в самом конце вычислений как самая последняя операция.
Ответ 9
Схема (вариант lisp) имеет функцию, называемую "bignum". существует много хороших реализаций схем, доступных как в полной языковой среде, так и встраиваемых сценариях. несколько я могу ручаться за
MitScheme (также называемая схемой gnu) PLTScheme Chezscheme Guile (также проект gnu) Схема 48
Ответ 10
По-видимому, Tcl также имеет их, начиная с версии 8.5, благодаря LibTomMath:
http://wiki.tcl.tk/5193 http://www.tcl.tk/cgi-bin/tct/tip/237.html http://math.libtomcrypt.com/
Ответ 11
В PHP у вас есть BCMath. Вам не нужно загружать DLL или компилировать любой модуль. Поддерживает номера любого размера и точности, представленные в виде строки
<?php
$a = '1.234';
$b = '5';
echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.2340
?>
Ответ 12
Существует несколько библиотек Javascript, которые обрабатывают арифметику с произвольной точностью.
Например, используя мою библиотеку big.js:
Big.DP = 20; // Decimal Places
var pi = Big(355).div(113)
console.log( pi.toString() ); // '3.14159292035398230088'
Ответ 13
Java изначально может выполнять операции bignum с помощью BigDecimal. GMP - стандартная библиотека defacto для bignum с C/С++.
Ответ 14
Если вы хотите работать в мире .NET, вы можете использовать еще класс java.math.BigDecimal. Просто добавьте ссылку на vjslib (в рамках), а затем вы можете использовать классы java.
Самое замечательное, что они могут использоваться для любого языка .NET. Например, в С#:
using java.math;
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
BigDecimal bd = new BigDecimal("12345678901234567890.1234567890123456789");
Console.WriteLine(bd.ToString());
}
}
}
Ответ 15
В R вы можете использовать Rmpfr пакет:
library(Rmpfr)
exp(mpfr(1, 120))
## 1 'mpfr' number of precision 120 bits
## [1] 2.7182818284590452353602874713526624979
Вы можете найти виньетку здесь: Произвольно точные вычисления с R: Пакет Rmpfr