Действительное число арифметика в общем языке целью?

голоса
3

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

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

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

Задан 17/09/2010 в 15:52
источник пользователем
На других языках...                            


12 ответов

голоса
2

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

Ответил 17/09/2010 в 15:56
источник пользователем

голоса
0

Ява: java.math.BigDecimal

C #: decimal

Ответил 17/09/2010 в 15:58
источник пользователем

голоса
0

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

Ответил 17/09/2010 в 16:01
источник пользователем

голоса
0

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

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

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

Ответил 17/09/2010 в 16:03
источник пользователем

голоса
-1

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

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

Ответил 17/09/2010 в 16:04
источник пользователем

голоса
2

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

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

Ответил 17/09/2010 в 16:18
источник пользователем

голоса
0

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

Рубин имеет класс Rational, так что 1/3 может быть выражен точно так, как рациональным (1,3). Он также имеет сложный класс.

Ответил 17/09/2010 в 16:24
источник пользователем

голоса
1

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

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

Ответил 17/09/2010 в 16:26
источник пользователем

голоса
0

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

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

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

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

Ответил 17/09/2010 в 16:35
источник пользователем

голоса
0

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

Ответил 17/09/2010 в 16:35
источник пользователем

голоса
1

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

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

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

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

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

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

Ответил 17/09/2010 в 16:43
источник пользователем

голоса
1

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

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

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

Ответил 17/09/2010 в 18:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more