任何编程语言中的非理性数字表示?

时间:2011-03-23 15:04:47

标签: java c++ python ruby numbers

有没有人知道任何编程语言中的无理数表示类型/对象/类/什么?

欢迎所有建议。

简单地说,如果我有两个不合理的对象,两个都代表五的平方根,并且我将这些对象相乘,我想要得到整数五,而不是浮点数4点,即9秒。

具体来说,我需要表示能够收集术语,而不是每次都解析为整数/浮点数。例如,如果我想添加五比一的平方根,我不希望它返回一些近似整数/浮点数,我希望它返回一个对象,我可以添加/乘以另一个无理对象,这样我可以告诉对象在最近的时间解决,以最小化浮点近似误差。

非常感谢!

7 个答案:

答案 0 :(得分:16)

您正在寻找的是象征性数学。您可能想尝试一些计算机代数系统,如Maxima,Maple或Mathematica。还有用于此目的的库,例如Python的SymPy库。

答案 1 :(得分:7)

您可以尝试sympy,因为您似乎是在符号计算之后并且可以使用Python。

答案 2 :(得分:3)

看起来已经提到的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表达式,你很快就会意识到你无论如何都需要使用符号数学。

答案 3 :(得分:1)

编译其他人所说的一些内容,并为其他语言添加一些解决方案......

C ++

  

食人鱼

Try bluescarni's Piranha "computer algebra library"

// 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 包装器(&#34; Pyranha&#34;)可用。

  

SymEngine

SymEngine是另一个基于C ++的符号数学库,包含 Python Ruby Julia Haskell的。 SymEngine与SymPy和Sage很好地集成,适用于Python。

的Java

  

SymJa

Try axkr's Symja Library

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

>>> sin(pi/2)
1

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

或者,您可以使用Jython在Java中获取SymPy

的Python

  

SymPy

正如其他人所说,SymPy is the go-to for symbolic mathematics in Python

enter image description here

红宝石

  

符号

Brainopia's Symbolic是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

请随意使用其他符号数学库编辑或修改此答案。根据经验,我没有包含任何&#34;任意精度&#34;数学库,因为这与无限精度符号数学库不同。我还没有包括最近没有更新过的陈旧套餐。

答案 4 :(得分:0)

Matlab中的基本数字类型是复杂浮点数的矩阵。具体来说,如果您键入x = 1,您实际分配给x的是一个1x1矩阵,其[0,0]元素等于1 + 0i。

答案 5 :(得分:0)

在红宝石中有http://flt.rubyforge.org/,它可以为你提供我想要的东西。

答案 6 :(得分:0)

我记得Smalltalk中的MathMorph有一个AlgebraicNumbers(包括部首)的表示,作为具有整数系数的单变量多项式的根,位于一定的间隔内。
你会发现Sturm定理http://en.wikipedia.org/wiki/Sturm%27s_theorem的有趣应用 你必须稍微谷歌并挖掘旧的档案,MathMorph是一个古老的项目...