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

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

欢迎所有建议。

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

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

非常感谢!

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

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

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

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


C ++

食人鱼

试试bluescarni的食人鱼“计算机代数库”

 // Include the standard I/O header. #include  // Include the global Piranha header. #include  // 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 ++的符号数学库,包含PythonRubyJuliaHaskell的包装器。 SymEngine与SymPy和Sage很好地集成,适用于Python。


Java的

SymJa

试试axkr的Symja图书馆

 >>> 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是Python中符号数学的最佳选择 :

在此处输入图像描述


ruby

象征

Brainopia的Symbolic是Ruby的象征性数学库(没有外部依赖):

 0 * x # => 0 2 + x + 1 # => x + 3 -(xy) + 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 

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

Matlab中的基本数字类型是复杂浮点数的矩阵。 具体来说,如果键入x = 1 ,那么您真正赋予x的是1×1矩阵,其[0,0]元素等于1 + 0i。

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

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