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)(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)use Math::Complex; Math::Complex->emake(1, pi) + 1
1.22464679914735e-16ifrom 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)complex(argument = pi) + 1
0+1.224606353822377e-16i我同意Ryan,你需要转移到另一个数字表示系统.解决方案超出了浮点数学的范围,因为你需要pi表示为无限长的小数,所以任何有限的精度方案都不会起作用(至少没有使用某种软糖因子来弥补丢失精确).
你的问题对我来说似乎有些奇怪,因为你似乎在暗示浮点数学是由语言实现的.这通常不正确,因为FP数学是使用硬件中的浮点处理器完成的.但是软件或硬件,浮点总是不准确的.这就是浮动的工作方式.
如果您需要更好的精度,则需要使用不同的数字表示.就像你在不适合int或long的数字上做整数数学一样.有些语言有内置的库(我知道java有BigInteger和BigDecimal),但是你必须明确地使用那些库而不是本机类型,并且性能会(有时显着)比使用浮点数时更差.
我和我最好的朋友喝了很长时间的咖啡聊天,谈论无理数和其他数字之间的差异。好吧,我们都同意这个不同的观点:
\n\n无理数在某种程度上是关系,就像函数一样,以什么方式?好吧,想想“如果你想要一个完美的圆,给我一个完美的圆周率”,但圆与其他数字不同(4条边、5、6...100、200)但是...还有多少边呢你有,它看起来更像一个圆圈。如果您到目前为止都跟着我,那么这里连接所有这些想法的是 pi 公式:\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