各位读者可能知道,不同品牌或者不同型号的计算器算法可能不同,甚至(看起来显示精度相同的计算器)精度实际上也是不同的。如果计算器没错误的话,应该是处理(通常是对于二进制而言的)数位过多的数据,尤其是无限小数,尤其是输入有理数返回无理数的计算时会产生这种区别,不过功能复杂的科学计算器会被设计成储存的精度比显示的高的效果,比如一个十位有效数字的计算器显示出了 4.810477381 的结果,此时其内部存储的结果会是 4.810477380965 甚至更高精度(通常的计算器应该是二进制运算和存储吧,此处用十进制说明),而显示出来的结果都会比较稳妥,两种计算器看不出差异(差异可能存在于没显示的部分)。但是继续计算,比如某种不收敛的迭代运算就可能把这种差异放大到可见的程度,这也是用简单的工具产生蝴蝶效应的一个实验。

为了追求结果的稳妥,(我认为)设计计算器的时候可以用此理由拒绝一些计算,比如[latex]\sin(10^9)[/latex](MS office Excel 2007 会拒绝此计算),虽然可以肯定这个结果不会超过什么浮点数范围(与之相比阶乘、幂等运算就会很容易超过什么范围),1 000 000 000 也不是什么大得处理不了的数。也就是这里,我发现有的时候这些计算工具确实会产生可见的差错,虽然之前也注意到过,现在需要一定精度的计算时开始觉得这种差错不可忽视,是影响到这种使用的程度(还好发现了,要是不知此情况而认为显示出的数字都是准确的那就不好了)。

并不使用迭代或者复杂的运算,下面我记录一下一些计算工具简单内置的常用函数,以Mathematica为准,红色的数字表示有误的部分,正确四舍五入不算有误用绿色标记,而正确的截断但不是正确的四舍五入用蓝色标记,仅对最后一位使用。
Mathematica 简写作 MAT,用 N[expr,50] 给出50位有效数字;MS office Excel 2007 简写作 E07;Win7 自带计算器简写作 7CA;Javascript 简写作 JAS。

首先是[latex]\sin 1[/latex]:
MAT: 0.84147098480789650665250232163029899962256306079837
E07: 0.841470984807897
7CA: 0.8414709848078965066525023216303
JAS: 0.8414709848078965

[latex]\sin 1000[/latex]:
MAT: 0.82687954053200256025588742910921814121272496784779
E07: 0.826879540532003
7CA: 0.82687954053200256025588742910922
JAS: 0.8268795405320025

是不是好像没多大错?接下来就出现了

[latex]\sin 1000000[/latex]:
MAT: -0.34999350217129295211765248678077146906140660532872
E07: -0.349993502171308
7CA: -0.34999350217129295211765248678077
JAS: -0.34999350217129177
[latex]\sin 10000000[/latex]:
MAT: 0.42054779319078249129850658974094559516717524753080
E07: 0.420547793190927
7CA: 0.42054779319078249129850658974095
JAS: 0.4205477931907708
[latex]\sin 100000000[/latex]:
MAT: 0.93163902710972600802751665361204297047290183852754
E07: 0.931639027110306
7CA: 0.93163902710972600802751665361204
JAS: 0.9316390271096793
[latex]\sin 1000000000[/latex]:
MAT: 0.54584344944869956424438727089751452899502293026289
E07: 错误(#NUM!)
7CA: 0.54584344944869956424438727089751
JAS: 0.5458434494497783

已经差了很多位,难怪不计算了,只能欢送Excel出局。而Javascript还在强撑……

[latex]\sin 1 000 000 000 000[/latex]:
MAT: -0.61123870237688949819202041532463056649624170559342
7CA: -0.61123870237688949819202041532463
JAS: -0.6112387013579699

[latex]\sin 1 000 000 000 000 000[/latex]:
MAT: 0.85827279317023583552388639084840664660020340822073
7CA: 0.8582727931702358355238863908484
JAS: 0.8582721324763734

[latex]\sin 1 000 000 000 000 000 000[/latex]:
MAT: -0.99296932074040507620955301726363027085998456867821
7CA: -0.99296932074040507620955301726123
JAS: -0.9928161040530035

[latex]\sin 1 000 000 000 000 000 000 000[/latex]:
MAT: -0.66712017707180484696519575812617624868948413154158
7CA: -0.66712017707180484696519575812618
JAS: 错误(0.8332490480535)

到这里Javascript终于放弃治疗了,而Win7计算器不知道什么原因有一些波动,还是能坚持的

[latex]\sin 1 000 000 000 000 000 000 000 000[/latex]:
MAT: -0.99647222910258325837583592426218489772581924687542
7CA: -0.99647222910258325837583592426218
JAS: 错误(-0.03732302703363715)

[latex]\sin 1 000 000 000 000 000 000 000 000 000[/latex]:
MAT: 0.71806349613911766607951565214634705272349173786033
7CA: 0.71806349613911766607951565213469
JAS: 错误(-0.522716546307594)

[latex]\sin 100 000 000 000 000 000 000 000 000 000[/latex]:
MAT: 0.99995928459840576572350091279747916876501995785707
7CA: 0.99995928459840576572350091279748
JAS: 错误(0.41420674441457567)

[latex]\sin 1 000 000 000 000 000 000 000 000 000 000[/latex]:
MAT: -0.090116901912138058030386428952987330274396332993043
7CA: -0.09011690191213805803038642895299
JAS: 错误(-0.7562627303335765)

[latex]\sin 10 000 000 000 000 000 000 000 000 000 000[/latex]:
MAT: 0.78481232612639561633855654446698060211871509432318
7CA: 0.78481232612639561633855654446698
JAS: 错误(-0.8862734160108359)

32位十进制数就是Win7计算器输入的极限了,也就到此为止了,看来在Sin函数上这个自带计算器还是挺准确的,就是不知道为什么有时候会错那么三位……
(未完)




请在下面框内输入适当大小的实数(推荐输入-177至+170.624376956之间不过于接近负整数的值,极端或不当输入可能会引发故障)


Factorial(Stirling Est.) =

Factorial(Stirling Est.2) =

Factorial(Stirling Est.2+PQ) =

Factorial(Stirling Est.7) =

Factorial(Stirling Est.7←30) =

Factorial(Stirling Est.7←30P(1)) =

Factorial(Brutal Integrate+) =

Factorial(Brutal Integrate) =

Factorial(Brutal Integrate-) =

Factorial(Raw Brutal Int.+) =

Factorial(Raw Brutal Int.) =

Factorial(Raw Brutal Int.-) =




请在下面两个框内输入两个正数



QM =

QAM =

AM =

QGM =

AGM =

QHM =

GM =

AHM =

GHM =

HM =

大约是十年前遇到的这个问题:[latex]x^2=2^x[/latex],x 的解有哪些?

在 x 是实数的情况下很好办,……至少能画图估计出大概的值,不过徒手画而又不细心的话有可能会误认为有两个解。实际是三个:

$$\begin{cases}
x_1 = -0.766664695962123093111204422510…(很接近\frac{23}{30})\\
x_2 = 2\\
x_3 = 4
\end{cases}$$

既是为了挑战,另外也是因为这个方程计算简单,我当时就想要计算一下复平面上的的情况。那时候我用的是 Excel,主要利用 Excel 的画图表功能目视出其他解,Excel 应该并不会直接在复域内运算,所以说这个方程比较简单还可以计算,太复杂就难办了。[latex]z^2[/latex] 无非就是像对待两个基向量一样对待实数和虚数,以下用 [latex](u + v i)[/latex] 来表示 z:

$$(u + v i)^2 = u^2 – v^2 + 2uv i$$

Excel 里只能这样去处理复数运算。至于 [latex]2^z[/latex],首先应该换底为 [latex]e[/latex],[latex]e[/latex] 的纯虚数次幂只改变辐角,绝对值始终是 1,实数次幂才能改变绝对值,而辐角不变。

$$2^z = e^{ln2 z}$$

根据棣莫弗公式这样就能在 Excel 上处理复域内的幂运算了。
我记得当时我可能找到了三对复数解,但是距离原点比较远超过预计,计算不太精确,也不确定,还记得通过画图证明对于这个方程,z 实部为负的时候除了上面的 [latex]x_1 = -0.76666…[/latex] 不存在其他解。
这些解都是共轭的,距离原点最近的复数解是:

$$\begin{cases}
u_1 = 7.6545064969779272…\\
v_1 = ± 11.9536789122631558…
\end{cases}$$

这些解大致分布在

$$v^2 = e^{\frac{u}{w}} – e^{\frac{4}{w}}$$

这条曲线上,其中 [latex]w = 1.4426950…[/latex]
确切地说是在这条曲线右边也就是

$$v^2 < e^{\frac{u}{2w}} - e^{\frac{4}{2w}}$$ 这边,同时又有: $$v > e^{\frac{u}{2w}} – e^{\frac{4}{2w}}$$

还是离第一条曲线近一点。其他解:

$$\begin{align}
z_2 & = 9.09072986074… & ± 21.50795035053… i\\
z_3 & = 10.03684857241… & ± 30.81806328298… i\\
z_4 & = 10.74672952594… & ± 40.03453628148… i\\

\end{align}$$