23

大多数数学家都同意:

e πi + 1 = 0

但是,大多数浮点实现不同意。我们能在多大程度上解决这个争端?

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

4

10 回答 10

17

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

PI 是一个无限系列的数字,除了符号表示之外,没有人能够用任何东西来表示,而 e^X 也是如此,因此达到 100% 准确度的唯一方法就是使用符号表示。

于 2008-12-26T20:22:01.910 回答
10

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

  • 方案:(+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Chez 方案,麻省理工学院方案)
    • 0.0+1.22460635382238e-16i(诡计)
    • 0.0+1.22464679914735e-16inumbers鸡蛋鸡)
    • 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)(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-16i
  • Python: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)(核磁共振)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • 回复:complex(argument = pi) + 1
    • 0+1.224606353822377e-16i
于 2008-08-04T06:22:18.713 回答
7

有可能解决这个争端吗?

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

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

也许一个更好的例子是 sin(π) = 0?(或者我又错过了重点?)

于 2008-08-04T06:29:03.910 回答
5

我同意 Ryan 的观点,你需要转移到另一个数字表示系统。该解决方案超出了浮点数学的范围,因为您需要将 pi 表示为无限长的小数,因此任何有限的精度方案都行不通(至少在不使用某种软糖因子来弥补丢失的情况下)精确)。

于 2008-08-25T01:10:29.007 回答
5

您的问题对我来说似乎有点奇怪,因为您似乎暗示浮点数学是由该语言实现的。这通常不是真的,因为 FP 数学是使用硬件中的浮点处理器完成的。但是无论是软件还是硬件,浮点数总是不准确的。这就是花车的工作原理。

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

于 2008-08-25T13:37:28.430 回答
4

@瑞恩福克斯

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

原生复杂数据类型远非未知。Fortran 在 60 年代中期就有了它,并且 OP 展示了各种其他语言来支持它们。

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

但是除非你为这个问题提供一个特例,否则“不同意”只是不精确的机器算术的一种表达,不是吗?这就像在抱怨

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

以 (t != 0) 结尾(至少如果您使用足够愚蠢的编译器)...

于 2008-08-25T13:29:01.803 回答
4

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

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

所以,pi 是一个函数,但它永远不会结束!因为 ∞ 参数,但我喜欢认为您可以拥有 pi 的“实例”,如果您将 ∞ 参数更改为非常大的 Int,您将拥有一个非常大的 pi 实例。

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

把所有的想法放在一起:

由于我们有内存限制,语言和库为我们提供了巨大的无理数实例,在这种情况下,pi 和 e,作为最终结果,你将有很长的方法来获得 0,就像@Chris Jester-Young 提供的示例一样

于 2017-05-06T03:07:58.910 回答
3

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

在没有本机表示的语言中,通常使用 OOP 添加它以创建一个Complex表示iand的类,并j使用运算符重载来正确处理涉及其他Complex数字和或该语言本机的其他数字原语的操作。

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

于 2008-08-25T13:48:46.517 回答
3

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

这不仅会影响这里所讨论的方程,还会给所有事情带来不稳定性,从求解一组近乎奇异的联立方程组,到找到多项式的零点,再到计算 log(~1) 或 exp(~0) (我什至看到了用于评估 log(x+1) 和 (exp(x)-1) 来解决这个问题的特殊函数。

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

对不起,自从我在大学里听到这句话已经 43 年了,即使我能记住参考资料,我相信现在还有更好的东西。我建议以此为起点。


如果这听起来有点傲慢,我道歉。我的“数值分析 101”是我化学课程的一部分,因为当时没有太多的 CS。我真的不知道数值分析在现代 CS 课程中的位置/重要性。

于 2008-12-26T21:22:09.527 回答
3

这是我们当前浮点计算架构的限制。浮点运算只是数字极点的近似值,例如 e 或 pi(或任何超出您的位允许的精度)。我真的很喜欢这些数字,因为它们无视分类,并且似乎比标准系列的素数具有更大的熵(?)。比率不符合数字表示,有时像这样简单的事情会让人大吃一惊(我喜欢它)。

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

考虑一种以机器可以理解的形式描述 e 和 pi 等概念的库/语言。机器对什么是完美圆有任何概念吗?可能不是,但我们可以创建一个对象 - 圆,它满足我们赋予它的所有已知特征(恒定半径,半径与圆周的关系为 2*pi*r = C)。像 pi 这样的对象仅由上述比率描述。r & C 可以是数字对象,用你想给它们的任何精度来描述。e 可以定义为“因为 e 是唯一的实数,使得函数 f(x) = ex 在点 x = 0 处的导数(切线的斜率)的值恰好是 1”来自维基百科

有趣的问题。

于 2009-11-20T20:37:54.937 回答