代码之家  ›  专栏  ›  技术社区  ›  C. K. Young

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

  •  20
  • C. K. Young  · 技术社区  · 16 年前

    大多数数学家都同意:

    e + 1=0

    然而,大多数浮点实现并不一致。我们能在多大程度上解决这场争端?

    我渴望听到不同的语言和实现,以及使结果尽可能接近零的各种方法。要有创造力!

    10 回复  |  直到 7 年前
        1
  •  17
  •   Lasse V. Karlsen    16 年前

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

    π是一个无穷多的数字系列,除了符号表示,没有人能用其他任何东西来表示,e^x是相同的,因此达到100%准确度的唯一方法就是符号化。

        2
  •  10
  •   C. K. Young    16 年前

    下面是我尝试过的实现和语言的简短列表。它按接近零的程度排序:

    • 方案: (+ 1 (make-polar 1 (atan 0 -1)))
      • 0.0+1.2246063538223773e-16i (CHEZ方案、MIT方案)
      • 0.0+1.22460635382238e-16i (诡计)
      • 0.0+1.22464679914735e-16i numbers 鸡蛋)
      • 0.0+1.2246467991473532e-16i (Mzscheme、Sisc、Gauche、Gambit)
      • 0.0+1.2246467991473533e-16i (单片机)
    • 普通Lisp: (1+ (exp (complex 0 pi)))
      • #C(0.0L0 -5.0165576136843360246L-20) (CLSP)
      • #C(0.0d0 1.2246063538223773d-16) (CCMUL)
      • #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) (JuRube)
    • R: complex(argument = pi) + 1
      • 0+1.224606353822377e-16i
        3
  •  7
  •   C. K. Young    15 年前

    有没有可能解决这个争端?

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

    事实上,一个人如何代表 (或) J 对于工程师来说)用传统的编程语言?

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

        4
  •  5
  •   Dana the Sane    16 年前

    我同意Ryan的观点,你需要换一个数字表示系统。解决方案超出了浮点数学的范围,因为您需要将pi表示为无限长的小数,所以任何有限精度方案都无法工作(至少不需要使用某种模糊因子来弥补丢失的精度)。

        5
  •  5
  •   Herms    16 年前

    我觉得你的问题有点奇怪,因为你似乎在暗示浮点数学是由语言实现的。这通常不是真的,因为fp数学是在硬件中使用浮点处理器完成的。但是软硬件,浮点永远是不准确的。浮球就是这样工作的。

    如果您需要更好的精度,您需要使用不同的数字表示。就像对不适合整数或长整数的数字进行整数运算一样。有些语言有内置的库(我知道Java有BigTigand和BigDecimal),但是你必须明确地使用那些库而不是本地类型,而且性能会(有时显著)比使用浮点差。

        6
  •  5
  •   dmckee --- ex-moderator kitten    16 年前

    @ Ryan Fox

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

    本机复杂数据类型远非未知。Fortran在60年代中期就已经拥有了它,并且OP展示了各种其他语言,在历史后续中支持它们。

    复数可以作为库添加到其他语言中(通过运算符重载,它们甚至看起来像代码中的本机类型)。

    但是除非你为这个问题提供了一个特殊的例子,“不一致”只是一个不精确的机器算法的表达,不是吗?就像抱怨那样

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

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

        7
  •  4
  •   developer_hatch    7 年前

    我和我最好的朋友聊了很久,聊到无理数和其他数之间的差异。好吧,我们都同意这个不同的观点:

    无理数是关系,作为函数,在某种程度上,是什么?好吧,想想“如果你想要一个完美的圆周率,给我一个完美的圆周率”,但是圆周率不同于其他的数字(4边,5,6…但是…你还有多少边,更像一个圆圈。如果你一直跟着我,把所有这些想法联系起来,这里是π公式: enter image description here

    所以,π是一个函数,但它永远不会结束!因为这个参数,但是我想你可以有一个π的“实例”,如果你把这个参数改成一个很大的整数,你会有一个很大的π实例。

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

    把所有的想法放在一起:

    由于我们有内存限制,语言和libs为我们提供了大量无理数的实例,在本例中,pi和e,作为最终结果,您将有很长的时间获得0,就像@chris jester young提供的示例一样。

        8
  •  3
  •   Chris Ani    16 年前

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

    在没有本机表示的语言中,通常使用oop添加它来创建 Complex 要表示的类 i j ,运算符重载以正确处理涉及其他 复合物 数字和或语言本身的其他数字基元。

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

        9
  •  3
  •   Brent.Longborough    16 年前

    数值分析告诉我们,你不能依赖于大数字之间微小差异的精确值。

    这不仅影响这里讨论的方程,还可能带来不稳定性,从解一组近似奇异的联立方程,到找到多项式的零点,到计算对数(~1)或exp(~0)(我甚至看到了计算对数(x+1)和(exp(x)-1)的特殊函数来解决这个问题)。

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

    不好意思,我在大学已经有43年没听过这样的推荐信了,即使我能记住推荐信,我相信现在还有更好的东西。我建议 this 作为起点。


    如果这听起来有点屈尊,我道歉。我的“数值分析101”是我化学课程的一部分,因为那时没有太多的化学物质。我对数值分析在现代计算机科学课程中的地位/重要性没有真正的感觉。

        10
  •  3
  •   Community CDub    7 年前

    这是我们当前浮点计算体系结构的一个限制。浮点运算只是一个数值极点的近似值,如e或pi(或任何超出位允许精度的数值)。我真的很喜欢这些数字,因为它们无视分类,而且似乎有更大的熵(?)甚至比素数,这是一个标准系列。比例挑战的数字表示,有时像这样简单的事情可以打击一个人的思想(我爱它)。

    幸运的是,通过使用符号概念(类似于 Lasse V. Karlsen )

    考虑一个库/语言,它以机器能够理解的形式描述E和PI等概念。机器有什么完美圆的概念吗?可能不是,但我们可以创建一个满足所有已知特征的对象圆(恒定半径,半径与周长的关系为2*pi*r=c)。像π这样的物体只能用上述比例来描述。R&C可以是数字对象,可以用您希望赋予它们的任何精度来描述。e可以定义为“e是唯一的实数,这样函数f(x)=e x在x=0点的导数(切线的斜率)的值正好是1”,从 wikipedia .

    有趣的问题。