Pi/无限数字

8

我对计算中的无限数字,尤其是圆周率感到好奇。

要让计算机绘制一个圆,它必须理解圆周率。但如果它是无限的,它怎么能理解呢?

我是不是想太多了?它会使用一个四舍五入的值吗?


9
实际上,画圆时不需要使用π的值。描述圆的方程式为x^2 + y^2 = R^2,可以看到没有提到π。关于如何实现这种算法的更多细节,请参阅http://en.wikipedia.org/wiki/Midpoint_circle_algorithm。 - Pavel Minaev
3
顺便说一下,圆周率不是无限的。正确的词应该是“非终止的”(我认为)。 - David Z
11
你想要的词是"超验的(transcendental)",请深思熟虑。 - David Plumpton
4
我的圆规懂π吗?我的带有一端铅笔和另一端钉子的绳子懂π吗?π只是一个圆的周长与直径之比。你不需要了解π就能画圆。 - Frozenskys
2
实际上,我之前说“连分数”是错误的,因为连分数是完全不同的东西。我认为“连续小数”才是正确的术语。但是,当应用于二进制时,我不确定正确的术语是什么。 - RBarryYoung
显示剩余15条评论
10个回答

15

在数学上,计算机既是有限的又是不连续的,因此无法完全知道圆周率 PI,也无法正确地渲染圆形。

然而,在数字世界中,这些都不存在,因此近似计算圆周率并使用它来近似渲染圆形是足够的,从而得到与精确的 PI 相同的像素集合。

但无论哪种方法,由此得到的像素点都不是真正的圆形,因为它们是有限数量的数字点组成的,而圆形是由无数个点组成的曲线,大多数点的值都是无理数。

(有人曾指出,通常不使用 PI 来绘制圆形,这是正确的。然而,用于绘制圆形的方法与用于表达和/或计算 PI 值的公式相关,仍存在相同的问题)。


我很好奇为什么会有随机的负评?如果我的回答有问题,请告诉我。但据我所知,从数学和计算理论的角度来看,它是完全正确的。 - RBarryYoung
1
确实,这是一个非常好的高层次解释。它之所以如此出色,是因为它不仅适用于圆形,而且具有普遍性。 - Pavel Minaev
实际上,由于人类既是非离散的又是“真实”的,因此从技术上讲,他们被认为是连续的。 - RBarryYoung
如果能提供编程语言的参考资料或一些额外的细节就太好了,因为答案只涉及到表面。 - Markus

7

一般来说,只需要一个近似值即可。为了“渲染”圆形,计算机只需要足够理解π的精确度以便在所需的分辨率(有限)下准确绘制。

编辑:正如其他人指出的那样,甚至不需要 π 来渲染圆。不过,问题的要点是“计算机如何处理像 π 这样的数字?”它们使用近似值,并且使用这些近似值的人必须决定它们是否足够精确以满足给定的目的。


渲染圆形时,通常根本不使用π。 - Nosredna

6
你完全不需要用π来画一个圆。有很多种方法可以画圆。最朴素的方法是用正弦和余弦。
我在8位机上看到最常见的算法是Bresenham's circle。甚至不需要使用浮点数运算。

Sin()和Cos()通常使用PI计算,或者使用e或从使用其中一种的值表中计算。是的,有绕过它的方法,但最直接的方法通常使用PI。 - RBarryYoung
1
正弦和余弦与e、pi和虚数有关,但我不认为它们通常是从这些东西中的任何一个或者代表这些东西的表格中计算出来的。我会说,通过快速收敛的级数展开计算正弦和余弦才是典型的。但C语言并没有规定它们应该如何计算。你可以找到Taylor展开来计算圆函数,而不需要引用pi或e。尽管,正如我所说,所有这些实体都是相互关联的。 - Nosredna
抱歉,Nosredna,你是正确的。在我年迈的时候,我似乎忘记了如何构建泰勒级数等内容。 - RBarryYoung

2

计算机只是使用了 pi 的一个很好的近似值。

来自 MSDN 上关于 System.Math.PI 的文章:

该字段的值为 3.14159265358979323846。

顺便说一下:PI 不是无限的。它是无理数,意味着它有无限个不重复的小数位。有几个非常简短的 PI 表达式。(有关更多详细信息,请参见维基百科页面

这里有一个非常简短的 PI 表达式:

PI as Integral


圆周率PI没有重复的小数模式,因为它是超越数,这意味着它不仅是无理数(不能表示为两个整数的分数),而且也不是代数数(它不是任何有理多项式方程的解)。 - drrlvn
它有无限数量的非零小数位,但它们不重复。(关于这实际上被称为什么,请参见问题的评论) - David Z
糟糕!写成“重复”的完全是打错了。现在已经改为“非重复”了。 - abelenky

2

编程语言中使用一个圆形常数来表示π和类似的“无限”数字。

为了获得更高的精度,您需要使用循环迭代算法,其循环次数根据需要而定。


这个问题的本质在于这不是画圆的问题。 - HenryRootTwo

2

我曾在某处看到一个证明,如果要以毫米精度画出一条环绕宇宙的圆,你只需要不到100位的π,换句话说,远远少于那些用太多时间(或太多计算能力)计算的数字。现在,如果我能找到那个证明就好了... (编辑) 找到了


是的,但如果您想要进行抗锯齿处理呢? - Nosredna

1

计算机通常使用圆整后的π值,除非是特殊情况,比如科学计算。例如,在Python中,π的表示方式为:

>>> import math
>>> math.pi
3.1415926535897931

你可以在IDLE中测试这个,它是Python的交互式解释器。


有趣的是:C# 报告该值为 3.14159265358979323846。 注意数字:97931 vs. 97932。 对我来说,这看起来不仅仅是一个四舍五入误差。 - abelenky
只有约17个数字是有意义的。最后一位数字只不过是平台二进制转十进制算法返回的噪音。 - S.Lott

1

我相信它会四舍五入到非常小的数字,很可能是一个常数。 如果您使用PHP,这就是PI的呈现方式:

echo pi(); // 3.1415926535898
echo M_PI; // 3.1415926535898

就像你在高中只需要知道3.14159一样,计算机只需要足够的精度来获得相当准确的结果。


你最多只能表示17个十进制数字。 - S.Lott

1

一个近似值通常是“足够好的”,无论您是使用这个网站还是另一个网站的方法得到它。

“渲染”是另一回事。当您有限的屏幕分辨率时,完美的π值并不那么重要。

更新:计算可能是另一回事,与渲染不同。某些应用程序可能需要比标准double提供更高的精度。这取决于问题。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接