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

Chr*_*ung 20 language-agnostic math floating-point

大多数数学家都同意:

ë πi + 1 = 0

但是,大多数浮点实现都不同意.我们如何解决这一争议?

我很想知道不同的语言和实现,以及使结果尽可能接近零的各种方法.要有创意!

ang*_*son 17

这并不是说大多数浮点实现不同意,这只是他们不能得到100%的回答必要的准确性.而正确的答案是他们不能.

PI是一个无限的数字序列,没有人能比的符号表示的任何其他表示,和e ^ X是一样的,因此,只有这样,才能得到100%的准确率是去象征性的.


Chr*_*ung 10

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

  • 方案: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Chez Scheme,麻省理工学院计划)
    • 0.0+1.22460635382238e-16i(Guile)
    • 0.0+1.22464679914735e-16i(numbers鸡蛋鸡肉)
    • 0.0+1.2246467991473532e-16i(MzScheme,SISC,Gauche,Gambit)
    • 0.0+1.2246467991473533e-16i(SCM)
  • Common Lisp: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20)(CLISP)
    • #C(0.0d0 1.2246063538223773d-16)(CMUCL)
    • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Perl的: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • 蟒蛇: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j(CPython)
  • 红宝石: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16)(MRI)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i


Rya*_*Fox 7

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

我的第一个想法是寻找像Maple这样的象征性语言.我认为这不算浮点数.

事实上,如何用传统的编程语言代表i(或工程师的j)?

也许更好的例子是sin(π)= 0?(或者我再次错过了这一点?)


Dan*_*ane 5

我同意Ryan,你需要转移到另一个数字表示系统.解决方案超出了浮点数学的范围,因为你需要pi表示为无限长的小数,所以任何有限的精度方案都不会起作用(至少没有使用某种软糖因子来弥补丢失精确).


Her*_*rms 5

你的问题对我来说似乎有些奇怪,因为你似乎在暗示浮点数学是由语言实现的.这通常不正确,因为FP数学是使用硬件中的浮点处理器完成的.但是软件或硬件,浮点总是不准确的.这就是浮动的工作方式.

如果您需要更好的精度,则需要使用不同的数字表示.就像你在不适合int或long的数字上做整数数学一样.有些语言有内置的库(我知道java有BigInteger和BigDecimal),但是你必须明确地使用那些库而不是本机类型,并且性能会(有时显着)比使用浮点数时更差.


Dam*_*ero 5

我和我最好的朋友喝了很长时间的咖啡聊天,谈论无理数和其他数字之间的差异。好吧,我们都同意这个不同的观点:

\n\n

无理数在某种程度上是关系,就像函数一样,以什么方式?好吧,想想“如果你想要一个完美的圆,给我一个完美的圆周率”,但圆与其他数字不同(4条边、5、6...100、200)但是...还有多少边呢你有,它看起来更像一个圆圈。如果您到目前为止都跟着我,那么这里连接所有这些想法的是 pi 公式:\n在此输入图像描述

\n\n

所以,pi 是一个函数,但是一个永无止境的函数!因为 \xe2\x88\x9e 参数,但我喜欢认为你可以拥有 pi 的“实例”,如果你将 \xe2\x88\x9e 参数更改为一个非常大的 Int,你将拥有一个非常大的 pi实例。

\n\n

和e一样,给我一个巨大的参数,我会给你一个巨大的e。

\n\n

将所有想法放在一起:

\n\n

由于我们有内存限制,语言和库为我们提供了巨大的无理数实例,在本例中为 pi 和 e,作为最终结果,您将需要很长的时间才能得到 0,就像@Chris Jester-Young 提供的示例一样

\n