稍微转移到浮点(im)精度,第1部分

时间:2020-03-05 18:37:29  来源:igfitidea点击:

大多数数学家都同意:

eπi + 1 = 0

但是,大多数浮点实现都不同意。我们如何解决这个纠纷?

我热衷于了解不同的语言和实现,以及使结果尽可能接近零的各种方法。要有创造力!

解决方案

回答

这是我尝试过的实现和语言的简短列表。按接近零排序:

  • ? `0.0 + 1.22460635382238e-16i(Guile)
  • ? 0.0 + 1.22464679914735e-16i(带有数字鸡蛋的鸡肉)
  • ? `0.0 + 1.2246467991473532e-16i(MzScheme,SISC,Gauche,Gambit)
  • 0.0 + 1.2246467991473533e-16i(SCM)
  • #C(0.0d0 1.2246063538223773d-16)(CMUCL)
  • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Complex(0.0,1.2246467991473532e-16)(JRuby)

回答

是否有可能解决这一争端?

我的第一个想法是寻找一种象征性的语言,例如Maple。我不认为这算作浮点数。

实际上,如何用传统的编程语言表示i(对于工程师来说是j)?

也许更好的例子是sin()= 0? (还是我又错过了要点?)

回答

我同意Ryan的观点,我们需要转移到另一个数字表示系统。解决方案超出了浮点数学的范围,因为我们需要将pi表示为无限长的十进制数,因此任何有限的精度方案都行不通(至少在没有采用某种软化因子来弥补损失的情况下,这是不可行的)精确)。

回答

@瑞安·福克斯(Ryan Fox)

In fact, how does one represent i (or j for the engineers) in a conventional programming language?

本机复杂数据类型远非未知。 Fortran在六十年代中期就拥有了它,并且OP展示了多种其他语言来支持它们在历史跟踪中的应用。

并且可以将复数作为库添加到其他语言中(操作符重载它们甚至看起来就像代码中的本机类型一样)。

但是,除非为该问题提供特殊情况,否则"非协议"只是不精确的机器算法的表达,不是吗?就像在抱怨

float r = 2/3;
float s = 3*r;
float t = s - 2;

以(t!= 0)结尾(至少如果我们使用足够笨的编译器)...

回答

问题对我来说似乎有些奇怪,因为我们似乎暗示浮点数学是由该语言实现的。通常情况并非如此,因为FP数学是使用硬件中的浮点处理器完成的。但是软件或者硬件的浮点数总是不准确的。这就是浮动的工作方式。

如果需要更高的精度,则需要使用其他数字表示形式。就像我们要对不适合int或者long的数字进行整数数学运算一样。某些语言具有内置的库(我知道Java具有BigInteger和BigDecimal),但是我们必须显式地使用这些库而不是本机类型,并且其性能(有时会显着)要比使用浮点数差。

回答

In fact, how does one represent i (or j for the engineers) in a conventional programming language?

在没有本机表示形式的语言中,通常使用OOP将其添加以创建一个表示" i"和" j"的"复杂"类,并通过运算符重载来正确处理涉及其他"复杂"数字和或者该语言固有的其他数字原语。

例如:Complex.java,C ++ <complex>

回答

并非大多数浮点实现都不同意,只是它们无法获得获得100%答案所需的精度。正确的答案是他们做不到。

PI是一个无穷系列的数字,除符号表示法外,没有人能用其他任何方式来表示,而e ^ X是相同的,因此达到100%精度的唯一方法是使用符号表示法。

回答

数值分析告诉我们,我们不能依靠大数之间的小差异的精确值。

这不仅会影响此处讨论的方程,还会给从解决一组奇异的联立方程组,找到多项式的零点到计算log(〜1)或者exp(〜0)(我什至看到了用于评估log(x + 1)和(exp(x)-1)的特殊功能,以解决这个问题。

我鼓励我们不要考虑将差异归零-不能-而是要以确保最小误差的方式进行相关计算。

抱歉,自从我在uni上学习这本书已有43年了,即使我记得这些参考资料,我也相信现在有更好的东西了。我建议以此为起点。

如果听起来有点客气,我深表歉意。我的"数值分析101"是我的化学课程的一部分,因为当时的CS很少。我对现代CS课程中的位置/重要性数值分析并没有真正的感觉。

回答

这是我们当前浮点计算体系结构的局限性。浮点算术仅仅是e或者pi之类的数字极点的近似值(或者超出位所允许的精度的任何数值)。我真的很喜欢这些数字,因为它们违反了分类标准,并且似乎比甚至是质数(通常是标准数)的质数都更大的熵(?)。比率无视数字表示,有时诸如此类的简单事情可能会打动一个人的头脑(我喜欢它)。

幸运的是,通过使用符号概念(类似于Lasse V. Karlsen所描述的概念),可以将整个语言和库专用于精确的三角函数。

考虑一个库/语言,它以机器可以理解的形式描述了诸如e和pi之类的概念。机器是否有关于完美圆的概念?可能不是,但是我们可以创建一个满足我们归因于它的所有已知特征的对象圆(恒定半径,半径与圆周的关系为2 * pi * r = C)。像pi这样的对象仅由上述比率描述。 r&C可以是数字对象,可以通过我们希望赋予它们的精度来描述。 e可以从维基百科定义为" e是唯一的实数,因此在点x = 0处函数f(x)= ex的导数(切线的斜率)的值正好为1"。

好玩的问题。