3

Как мы надеемся, большинство из вас знает, что арифметика с плавающей запятой отличается от арифметики реального числа. Это для начала неточно. Многие числа, особенно десятичные числа (0,1, 0,3), не могут быть представлены, что приводит к таким проблемам, как this. Более подробный список можно найти here.Арифметика реального числа на языке общего назначения?

Есть ли общего назначения языки со встроенной поддержкой чего-то более близкого к реальному арифметическому числу? Если нет, то какие хорошие библиотеки поддерживают это?

EDIT: Произвольное точность decimal типы данных не, что я ищу для. Я хочу иметь возможность представлять номера, такие как 1/3, sqrt(3), или 1 + 2i.

+4

Несколько полезных ответов ниже (и я добавлю, что однажды написал рациональный номер математического пакета), но если вы серьезно, у вас есть проблема: вы не можете выразить все реальные (или даже все реальные на '[0 , 1) ') в конечном пространстве. Таким образом, существует твердое теоретическое требование, что вы можете стать реальным. Затем становится вопросом выбора аппроксимации, которая наилучшим образом соответствует вашим потребностям. – dmckee

+0

Errr ... относительно редактирования ... вы хотите реалы или комплексные числа? – dmckee

+0

@dmckee Я знаю об этом. Но возможно иметь «достаточно хорошие» приближения. Все, что они здесь используют, должно отлично работать: http://www.wolframalpha.com/index.html – NullUserException

ответ

0

Чтобы покрыть реальные цифры любым ударом, вам понадобится символический пакет.

Boost, проект C++, имеет библиотеку Rational, но это только часть истории.

У вас есть иррациональные числа во всех видах форм (pi, основание натурального логарифма, квадратные и кубические корни, Champernowne constant, чтобы назвать только несколько). Единственный способ, с помощью которого я могу справиться с арифметическими операциями, - это символический пакет с умственными способностями относительно отношения между всеми этими числами. Предполагая, что вы можете выразить e^pi, как бы вы добавили его? Или взять квадратный корень из него?

Mathematica может обрабатывать эти случаи.

2

Хотя я ненавижу говорить об этом, Фортран. Он имеет широкую поддержку арифметики произвольной точности и тонны поддержки вычислений большого числа. Это древний и грубый, но он выполняет свою работу.

+0

Если вы можете найти компилятор для одной из последних версий версии Fortran, это не все * это * брутто. –

+0

@ T.E.D. - Множество компиляторов на рынке больше всего; и некоторые (их увеличение числа) имеют все функции F2003. Я не нахожу это «древним» вообще (по сравнению с множеством других языков-компиляторов/переводчиков для них). И да, он имеет обширную поддержку ... многих вещей. Один, однако, если вы хотите, чтобы «брутто» всегда мог использовать только функции FORTRAN 66 :-) – Rook

+0

Это может запустить flamewar, но Fortran77 на самом деле самый верный. Вы пишете с ним короткие и эффективные подпрограммы, а затем вы называете их честным языком с такой же легкостью, как функции C. Это неверно для F90 или несуществующего в практике F2003 (это тот, у кого есть функции OO?) –

0

Java: java.math.BigDecimal

C#: decimal

+0

Мой ответ был до того, как вопрос был отредактирован. –

0

Много языков есть поддержка, что: Java имеет BigDecimal, Perl имеет Math::BigFloat и Math::BigRat, Haskell имеет Integer и много библиотек и языков перечислены в wikipedia.

+0

Ruby также имеет класс BigDecimal. – tcrosley

+0

ты мужик чтоли? – MyTitle

0

Ada поддерживает fixed-point математику, а также с плавающей запятой. Фиксированная точка может быть намного точнее, чем точка с плавающей запятой, пока показатели числа остаются в диапазоне.

Если вам нужны плавающие точки, но более высокая точность, чем дает IEEE, для каждого языка есть пакеты bignum.

Я думаю, что о лучшем, что вы можете сделать. Ни одна из схем не может точно представлять повторяющиеся десятичные числа (например, 1/3). Вероятно, можно было бы создать схему, которая будет работать, но я не знаю языка, который поддерживает такую ​​вещь со встроенным типом. Даже это не поможет вам с иррациональными числами (например, pi и e). Я считаю, что есть даже теорема, в которой говорится, что всегда будут непредсказуемые числа, независимо от того, какую схему вы придумали.

+0

Что бы они ни использовали, работает: http://www.wolframalpha.com/index.html – NullUserException

+1

ОК, используйте это, чтобы получить точное значение для pi, которое я могу использовать в своих программах. Я подожду здесь. :-) –

+0

Не говоря уже о том, что у них есть точная ценность, я говорю, что это мое определение «достаточно хорошо» – NullUserException

-1

Хотя его не «встроенный», я думаю, что C++ (возможно, C#) - ваш лучший выбор. Есть классы, которые были написаны для этой цели.

http://www.oonumerics.org/oon/

+1

Подавляющее большинство числовых библиотек написано для языков низкого уровня, таких как C и Fortran, а не языки высокого уровня, такие как C#. – Reinderien

+0

Вы могли бы с уверенностью сказать, что это возможно сделать на C++ и C#, если вы действительно этого хотите, но «лучший выбор»? Над языками с поддержкой для таких вещей? Едва. –

+0

Хотя, чтобы играть адвоката дьявола, C# имеет встроенную «десятичную» для более высокой точности: http://msdn.microsoft.com/en-us/library/364x0z75%28VS.80%29.aspx – Reinderien

2

Все числа, используемые в примерах, являются вашими algebraic numbers, и могут быть представлены конечно как корни многочленов с целыми коэффициентами.

То же самое нельзя сказать о действительных числах вообще, что легко увидеть, когда один считает, что реалы несчетны, но набор компьютерных программ - счетный. Поэтому большинство реалов не будет иметь конечного представления в коде.

0

EDIT: Произвольное точность десятичных типов данных не то, что я ищу для. Я хочу иметь возможность представлять цифры , например, 1/3, sqrt (3) или 1 + 2i .

Ruby имеет класс Rational, поэтому 1/3 может быть выражен точно как Rational (1,3). Он также имеет класс Complex.

+1

Существуют и другие языки, такие как Lisp, с рациональными и комплексными числами. Наличие нечислового способа представления квадратного корня из 3 гораздо реже. –

1

То, что вы ищете, это символический расчет (MATLAB и другие инструменты, используемые в математике и технике, хороши в этом).

Если вы хотите использовать общий язык, я думаю, что дерево выражений на C# - это хороший момент для начала. По сути, способность сохранять выражение (вместо оценки выражения в реальные значения) является ключом к возможности выполнять символический расчет. Обратите внимание, что дерево выражений не содержит символических вычислений, оно просто предоставляет структуру данных, которая поддерживает символический расчет.

0

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

1

Этот вопрос интересен, но вызывает некоторые проблемы. Во-первых, вы никогда не сможете представить все действительные числа, используя (даже теоретически бесконечный) компьютер по причинам мощности.

То, что вы ищете, является типом данных «символических чисел». Вы можете представить себе какое-то дерево выражений с предопределенными константами, арифметическими операциями и, возможно, алгебраическими (корнями многочленов) и трансцендентными (exp, sin, cos, log и т. Д.) Функциями.

Теперь интересная часть истории: вы не можете найти алгоритм, который говорит о том, представляют ли два таких дерева одинаковое число (или, что то же самое, которые проверяют, является ли такое дерево нулем). Я не буду утверждать ничего точного, но, как намек, это похоже на проблему остановки (для компьютерных ученых) или теорему о неполноте Гёделя (для математиков).

Это делает такой класс довольно бесполезным.

Для некоторых подполей вещественных чисел, то есть канонические формы, как/б для рациональных чисел, или конечных алгебраических расширений рациональных чисел (а/б + IC/д для сложных рациональных чисел, а/б + SQRT (2) * a/b для Q [sqrt (2)] и т. Д.). Их можно использовать для представления некоторых конкретных наборов алгебраических чисел.

На практике это самая сложная вещь, которая вам понадобится. Если у вас есть определенная необходимость, как диапазонов чисел с плавающей точкойдоказать некоторый результат Whithin заданного интервала, это, вероятно, ближе вы можете получить до действительных чисел) или произвольных точность чисел, у вас есть свободно доступные классы во всем мире. Google boost::range для первого и gmp для последнего.

1

Существует несколько языков с поддержкой рациональных и сложных чисел. Scheme, например, имеет встроенную поддержку в сколь угодно точные рациональных числа и комплексные числа с любой рациональной, с плавающей точкой, или интегральные коэффициенты:

> (+ 1/2 1/3) 
5/6 
> (* 3 1+1/2i) 
3+3/2i 
> (+ 1/2 .5) 
1.0 

Если вы хотите выйти за рамки рациональных чисел или комплексных чисел с рациональными коэффициентами , до algebraic таких чисел, как sqrt(2) или номера закрытой формы, такие как e, вам, вероятно, придется смотреть за пределы языков программирования общего назначения и использовать математический язык специального назначения, такой как Mathematica или Maxima.

Смежные вопросы