Language agnostic 通用语言中的实数算术?

Language agnostic 通用语言中的实数算术?,language-agnostic,floating-point,language-features,math,floating-accuracy,Language Agnostic,Floating Point,Language Features,Math,Floating Accuracy,正如(希望如此)大多数人所知道的,浮点运算不同于实数运算。首先,这是不精确的。许多数字,尤其是小数(0.1,0.3)无法表示,导致了以下问题。可以找到更详尽的清单 是否有任何通用语言内置了对更接近实数运算的支持?如果没有,哪些好的库支持这一点 编辑:任意精度decimal 数据类型不是我所看到的 对于我希望能够代表 像1/3,sqrt(3),或1+2i这样的数字 虽然我不想说,Fortran。它广泛支持任意精度的算法,并支持大量计算。它既古老又粗俗,但它完成了任务。Java:Java.math.

正如(希望如此)大多数人所知道的,浮点运算不同于实数运算。首先,这是不精确的。许多数字,尤其是小数(0.1,0.3)无法表示,导致了以下问题。可以找到更详尽的清单

是否有任何通用语言内置了对更接近实数运算的支持?如果没有,哪些好的库支持这一点

编辑:任意精度
decimal
数据类型不是我所看到的 对于我希望能够代表 像
1/3
sqrt(3)
,或
1+2i
这样的数字


虽然我不想说,Fortran。它广泛支持任意精度的算法,并支持大量计算。它既古老又粗俗,但它完成了任务。

Java:
Java.math.BigDecimal


C#:
decimal
很多语言都支持这一点:Java有
BigDecimal
,Perl有
Math::BigFloat
Math::BigRat
,Haskell有
Integer
,许多库和语言都列在表中。

Ada本机支持数学和浮点。只要数字的指数保持在范围内,定点可以比浮点更精确

如果您需要浮点,但精度比IEEE提供的要高,那么几乎每种语言都有bignum包

我想这是你能做的最好的了。两种方案都不能精确表示重复小数(如1/3)。可能会提出一个这样的方案,但我知道没有一种语言支持这种内置类型的东西。即使这样也不能帮助你处理无理数(比如π和e)。我相信,甚至有一个定理说,无论你想出什么方案,都会有不可代表的数字。

< P>虽然它不是“内置”,但我认为C++(也许是C)是你的最佳选择。有一些类是为此而编写的


示例中使用的所有数字都是,并且可以表示 有限地作为整系数多项式的根

一般来说,实数是不一样的,当一个 认为实数是不可数的,但计算机程序集是不可数的 可数的因此,大多数real在代码中不会有有限表示

编辑:任意精度十进制 数据类型不是我想要的 对于我希望能够代表 像1/3、sqrt(3)或1+2i这样的数字 还有


Ruby有一个Rational类,因此1/3可以精确地表示为Rational(1,3)。它也有一个复杂的类。

你要找的是符号计算(MATLAB和其他数学和工程工具都很擅长)


如果您想要一种通用语言,我认为C#中的表达式树是一个很好的起点。本质上,存储表达式(而不是将表达式计算为实际值)的能力是能够执行符号计算的关键。请注意,表达式树不提供符号计算,它只提供支持符号计算的数据结构。

要以任何方式覆盖实数,您需要一个符号包

Boost,C++项目,有一个库,但这只是故事的一部分。 无理数有各种形式(π,自然对数的底,平方根和立方根,等等)。据我所知,处理算术运算的唯一方法是一个符号包,其中包含所有这些数字之间的关系。假设你可以表达e^pi,你会如何添加一个呢?或者取它的平方根


Mathematica可能会处理这些情况。

定义了有理数、bignums、浮点和复数。不需要一个实现来支持所有这些功能,但是如果它们存在,您可以将它们混合在一起,它们将成为“正确的东西”。

这个问题很有趣,但会引发一些问题。首先,由于基数的原因,你永远无法用一台(甚至理论上是无限的)计算机来表示所有的实数


您要查找的是“符号数字”数据类型。您可以想象某种类型的表达式树,具有预定义的常数、算术运算,可能还有代数(多项式的根)和超越(exp、sin、cos、log等)函数

现在,故事有趣的一部分是:你找不到一个算法可以告诉你这两棵树是否代表同一个数字(或者等价地,测试这棵树是否为零)。我不会说任何精确的东西,但作为一个提示,这类似于停顿问题(对于计算机科学家)或哥德尔不完全性定理(对于数学家)

这使得这样的类非常无用

对于实数的某些子域,有标准形式,比如a/b表示有理数,或有理数的有限代数扩展(a/b+ic/d表示复有理数,a/b+sqrt(2)*a/b表示Q[sqrt(2)],等等)。这些可以用来表示一些特定的代数数集


实际上,这是你需要的最复杂的东西。如果您有特殊的需要,比如浮点数的范围(为了证明某些结果在指定的间隔内,这可能是最接近实数的结果),或者任意精度的数字,那么到处都可以自由使用类。谷歌
boost::range
用于前者,gmp用于后者。

有几种语言支持有理数和复数,例如,内置了对任意精确有理数和具有有理、浮点或整数系数的复数的支持
> (+ 1/2 1/3)
5/6
> (* 3 1+1/2i)
3+3/2i
> (+ 1/2 .5)
1.0