数学案例说明WEB 3.0时代,不可避免遭遇的数值正确性-by a Java Devops

电脑科学由於硬体的限制,存在计算的误差。从同一道数学问题,透过
程序解与手动解析解来观察此一现象最为显着。以下将以半径为1的单位圆内接
正多边形的周长,反推圆周率 π 来说明。


圆内接正多边形的面积、周长公式如下图:(注)
https://ithelp.ithome.com.tw/upload/images/20220130/20109107WQ55Uxi5W3.png
『当 n 无限增大,周长除以 2r 所得到的值,必定随着 n 增加而增加。 而最终的极限值恰好就是 π。』
可是透过电脑程序的数值解,上述的描述依旧正确吗?/images/emoticon/emoticon19.gif
以下在Repl.it上进行测试。


// π 本身就是超越数,以下限定计算式中用到pi值为-1的反余弦
double arccos2pi = Math.acos(-1.);

https://ithelp.ithome.com.tw/upload/images/20220131/20109107ut0RuWZsOL.png
在此就定义在Repl.it执行环境上的正确 π 值为
xxxxxx-circle : 3.141592653589793
以下将观察正 n 边形周长除以 2r 後所得到的 π 值与上述 xxxxxx-circle 值进行比较。

double perimeter4radius1circle2pi;
for (int n=最大边数; n>(最小边数-1); --n) {
   // 简化计算式,令 r=1
   perimeter4radius1circle2pi=n*Math.sin(arccos2pi/n);
   
   System.out.println(n+"-circle : " + perimeter4radius1circle2pi);
}

观察正三角形至正九边形的结果:
https://ithelp.ithome.com.tw/upload/images/20220131/20109107BI1Q6hU6jx.png
随着边数增加,依照多边形反推计算所得的 π 值越大,越接近 xxxxxx-circle。
目前手算与电脑算都能遵守我们习以为常的数学观点。
但是,到了 n = 249981 後,
https://ithelp.ithome.com.tw/upload/images/20220131/20109107OXTGuA6zan.png
『随着边数的增加,所计算出来的 π 值越大的这个规律已经出现问题了。』
甚至到了 n = 999999 时,数值反而又离 xxxxxx-circle 又误差更大了。
https://ithelp.ithome.com.tw/upload/images/20220131/20109107Vk7AZQItVg.png
这时候手算因为有效位数能无限延伸,反而没有此一问题。
『人脑还是比电脑强!』/images/emoticon/emoticon39.gif
不过,好消息是,当我们给 n = 2147483647 时,确实就得到 xxxxxx-circle 的值了。
https://ithelp.ithome.com.tw/upload/images/20220131/201091070OcO8psKwo.png
上述案例,当边数超过某特定值後,所得到的计算值不一定是正确值。直到
给予 int 在电脑上的极限值 2147483647,透过周长反推所计算出的 π
值与 Math.acos(-1) 所得到的值ㄧ致。


2021年,随着元宇宙(Metaverse)NFT、...,这类 Web 3.0 的服务相继崛起。
在分散式的架构下,这类的问题将会越来越显着。

Kubernetes 为例,当所有的分散系统透过 DeploymentStateful setPods
来实现後,在对所有服务设定 『memory request/limit』 的限制下,如
何去测试出在对应的资源中,一些数值的运算极限值,将会大大的影响执行结果及正确性。

真正的困难点在於程序设计师在 Unit Test 的过程中,能否进一步找出
memory request/limit 的合理值,使得在有限的节点上,水平扩展的过程中,所有服
务皆能计算得到可预期的正确结果。
不过『说』还是比较简单,实际并不容易『做』到。/images/emoticon/emoticon06.gif
只能自身技能再提升,/images/emoticon/emoticon18.gif
https://ithelp.ithome.com.tw/upload/images/20220131/20109107WKYCzg3mr0.jpg


(注)圆内接正多边形参考网址-https://www.efunda.com/math/areas/PolygonInscribedGen.cfm


<<:  实作系统呼叫与简易的 Shell

>>:  DE2_115(DAY1)以niosii去控制板子上的led灯

[11 月限时免费] 3 款 WordPress 布景主题免费下载

1.【WordPress 付费主题免费下载】Sentobar — Barbershop WordPr...

[Day 07] 透过 DAO 和资料库进行互动

除了使用 DSL 的方式和资料库进行互动之外,我们还可以透过更加物件导向的方式,来和资料库进行沟通。...

[Day32] Hexo - 修改主题样式及一些问题排除

虽然 Hexo 要完成架设 Blog 仅仅是几秒钟的时间就完成,但是在细部调整时还是会遇到不少困难,...

Day26 - HTML 与 CSS (8) - 背景图片

背景图片 background-image:使用 url(pic路径) 来显示图片 backgrou...

踏入 LeetCode 的第一步 - 操作与使用

初探 LeetCode 的操作与使用 注册登入 LeetCode 之後,可以从 Problems ...