Нерациональное представление чисел на любом языке программирования? - PullRequest
10 голосов
/ 23 марта 2011

Кто-нибудь знает тип иррационального представления чисел / объект / класс / что-нибудь в любом языке программирования?

Все предложения приветствуются.

Проще говоря, если у меня есть два иррациональных объекта, каждый из которых представляет квадратный корень из пяти, и я умножаю эти объекты, я хочу получить целое число пять, а не с плавающей точкой 4 лота o '9 с.

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

Большое спасибо!

Ответы [ 7 ]

17 голосов
/ 23 марта 2011

То, что вы ищете, называется символической математикой.Вы можете попробовать некоторые системы компьютерной алгебры, такие как Maxima, Maple или Mathematica.Для этого также есть библиотеки, например, библиотека SymPy для Python.

7 голосов
/ 23 марта 2011

Вы можете попробовать sympy , поскольку вы, похоже, после символических вычислений и можете использовать Python.

3 голосов
/ 23 марта 2011

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

С другой стороны, если вы не хотите вводить дополнительные зависимости и ваши иррациональные случаи ограничены умножением квадратных корней, в Python это простая задача:

class Irrational(float):
    def __new__(cls, base, radix=1):
        self = float.__new__(cls, base ** (1.0/radix))
        self.base =  base
        self.radix = radix
        return self
    def __mul__(self, other):
        if  isinstance(other, Irrational) and other.radix == self.radix:
            return Irrational(self.base * other.base, self.radix)
        return float.__mul__(self, other)

Пример:

>>> a = Irrational(5,2)
>>> a
2.2360679774997898
>>> a * Irrational(5,2)
5.0

Вы можете продолжить его и включить другие операции и угловые дела. Но для выражений compes вы скоро поймете, что вам все равно придется использовать символическую математику.

1 голос
/ 20 апреля 2018

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


C ++

Piranha

Попробуйте Piranha от bluescarni "Библиотека компьютерной алгебры"

// Include the standard I/O header.
#include <iostream>

// Include the global Piranha header.
#include <piranha/piranha.hpp>

// Import the names from the Piranha namespace.
using namespace piranha;

int main()
{
    // Piranha initialisation.
    init();
    // Print the rational number 4/3 to screen.
    std::cout << rational{4, 3} << '\n';
}

Существует также оболочка Python ("Pyranha").

SymEngine

SymEngine - еще одна библиотека символьной математики на основе C ++ с оболочками для Python , Ruby , Джулия и Haskell . SymEngine прекрасно интегрируется с SymPy и Sage для Python.


Java

SymJa

Попробуйте Symja Library от Axkr

>>> sin(30*degree)
1/2

>>> sin(pi/2)
1

>>> a+a+4*b^2+3*b^2
2*a+7*b^2

Кроме того, вы можете использовать Jython , чтобы получить SymPy в Java.


Python

SymPy

Как уже упоминалось, SymPy - это символическая математика в Python :

enter image description here


рубин

Символическая

Символическая Brainopia - это библиотека математических символов (без внешних зависимостей) для Ruby:

0 * x           # => 0
2 + x + 1       # => x + 3
-(x-y) + 2*x    # => x + y
(x**2)**3 / x   # => x**5

Symbolic::Math.cos(x**2).diff(x)
# => -2*(sin(x**2))*x
Symbolic::Math.cos(x).taylor(x,0,3)
# => -0.5*x**2+1.0

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

0 голосов
/ 02 июля 2012

Я помню, что MathMorph в Smalltalk имеет представление для алгебраических чисел (которое включает в себя радикалы) как корень многочлена от одной переменной с целыми коэффициентами, лежащими в определенном интервале.
Вы найдете интересные применения теоремы Штурма http://en.wikipedia.org/wiki/Sturm%27s_theorem
Вам придется немного погуглить и покопаться в старых архивах, хотя MathMorph - старый проект ...

0 голосов
/ 24 марта 2011

В рубине есть http://flt.rubyforge.org/, который дает вам то, что вы хотите, я верю.

0 голосов
/ 23 марта 2011

Основной числовой тип в Matlab - это матрица сложных чисел с плавающей точкой. В частности, если вы наберете x = 1, то вы действительно назначаете x матрицу 1x1 с элементом [0,0], равным 1 + 0i.

...