Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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());
            }
        }
    }