注册 登录
编程论坛 VB6论坛

程序到底是怎么进行计算的?

yuma 发布于 2021-02-17 17:43, 2882 次点击
下面问题,我问的有点傻。

1.23的3.21次方程序是怎么计算出来的,我想知道手工计算方法.
有没有同学愿意写一下过程?如下图
只有本站会员才能查看附件,请 登录






1除以3,再乘以3,程序为什么不会计算出0.9999999999999...
程序如何赋值计算的,知道的同学说下。如下图
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-2-17 17:46编辑过]

18 回复
#2
风吹过b2021-02-17 19:30
1、百度了一个,结果是先那指数转化为分数,分子用来计算整数次幂,然后分母进行开方。

2、最近刚看到一个等式 0.99999....(9循环) = 1
并且给出了一个粗略的证明。。。
所以。。。。。
计算机存在舍入误差,双精度占8个字节,64位,15位有效数据,并不是说计算机计算时只有15位有效数据,这15位仅仅是输出的精度。
英特尔的cpu计算浮点的时候内部精度是80位,输出输入还是64位(百度知乎的)。所以最后一位向前四舍五入就会导致这个误差被舍入了。


#3
yuma2021-02-17 20:45
回复 2楼 风吹过b
精辟

第2个问题,可能真的是四舍五入的结果。但我没证据。

第一个问题的手工计算方法,我请教过很多大学生,无人能解。
#4
ysr28572021-02-18 00:18
程序可以这么计算:小数化分数,分子是乘方,分母是开方,而手工计算是不能这么算的,用幂级数公式计算,选用收敛速度快的,几步除法和假发就可以得到精确的结果(大多是无理数,只有到无穷多位才能相等所以精确到点后某位就行,就是某项的小数在点后多少位是0再往后才是数字,就不用再算了),比如这个可以转换为对数,再还原位指数:先计算3.21*ln1.23(当然,手工计算需要用级数展开式,各项的和,某一项非常小了之后就不必再算了),设结果为x,再算e^x就还原回去了(也是级数展开)。仅是举例,可能有其他收敛速度快的公式和方法,还有牛顿迭代,就是求出函数方程在某点的导数比如在点3.21处的导数,就是初值,再经过迭代可以快速得到精确的结果。
我的说法不一定对,仅供参考。我也没有学过,某些如无穷级数是高等数学,咱不懂瞎说的,可以网上查阅。仅提供个思路,自己参考试验一下。网上可能有现成的程序,可以运行试试,帮组您弄懂道理。
晚安,祝愉快!(可以用计算器比较一下两种方法的结果是否相同,比如前面的方法和计算器直接计算的1.23^3.21是否一样?)

[此贴子已经被作者于2021-2-18 00:22编辑过]

#5
cwa99582021-02-21 08:52
好像用泰勒公式展开计算。
可以看作指数函数,f(x)=a^x
#6
yuma2021-02-23 15:28
以下是引用ysr2857在2021-2-18 00:18:43的发言:

程序可以这么计算:小数化分数,分子是乘方,分母是开方,而手工计算是不能这么算的,用幂级数公式计算,选用收敛速度快的,几步除法和假发就可以得到精确的结果(大多是无理数,只有到无穷多位才能相等所以精确到点后某位就行,就是某项的小数在点后多少位是0再往后才是数字,就不用再算了),比如这个可以转换为对数,再还原位指数:先计算3.21*ln1.23(当然,手工计算需要用级数展开式,各项的和,某一项非常小了之后就不必再算了),设结果为x,再算e^x就还原回去了(也是级数展开)。仅是举例,可能有其他收敛速度快的公式和方法,还有牛顿迭代,就是求出函数方程在某点的导数比如在点3.21处的导数,就是初值,再经过迭代可以快速得到精确的结果。
我的说法不一定对,仅供参考。我也没有学过,某些如无穷级数是高等数学,咱不懂瞎说的,可以网上查阅。仅提供个思路,自己参考试验一下。网上可能有现成的程序,可以运行试试,帮组您弄懂道理。
晚安,祝愉快!(可以用计算器比较一下两种方法的结果是否相同,比如前面的方法和计算器直接计算的1.23^3.21是否一样?)



结果不对,小数化分数,分子是乘方,分母是开方
应该不是计算精度的问题,差好多。
程序代码:
Private Sub Form_Load()
Debug.Print 0.3 ^ 0.3
Dim a As Double, b As Double, c As Double, d As Double, e As Double
Dim f As Double, g As Double, h As Double, i As Double, j As Double
Dim k As Double

a = 0.3 ^ 3
b = Sqr(a)
c = Sqr(b)
d = Sqr(c)
e = Sqr(d)
f = Sqr(e)
g = Sqr(f)
h = Sqr(g)
i = Sqr(h)
j = Sqr(i)
k = Sqr(j)

Debug.Print k
End Sub

只有本站会员才能查看附件,请 登录
#7
wmf20142021-02-23 15:48
回复 6楼 yuma
你这数学底子好薄啊,请教ysr2857版主肯定没错,他是学数学的。
开方不是光开二次方,你这里需要手动计算开十次方,算法有二分法和牛顿迭代法。二分法比较好懂,迭代法逼近速度快。
#8
ysr28572021-02-23 18:32
回复 6楼 yuma
是啊,你这个转换的不对,3.21=3+21/100,近似于3+1/5,近似值是这样的:1.23^3*1.23^(1/5)=1.860867*1.04227188=1.93952935.这只是个近似值,点后两位是差不多的。
实际计算器直接计算的结果是:1.23^3.21=1.94354861.
#9
ysr28572021-02-23 18:41
回复 6楼 yuma
如果把3.21写成321/100,那就得把1.23乘321次再开100次方,那计算就麻烦了,没有计算器手工算不了。
开100次方不等于100次平方根计算,由于100=2*2*5*5,实际是开两次平方和开两次5次方,当然有计算器的话就可以直接开一次100次的方根。
你开了10次平方根等于开了2^10=1024次方根运算。

5#楼说的好,可以用泰勒级数展开计算。

7楼说的对一般用迭代法比较快,计算精度不高的话才用泰勒级数展开,精度超过点后10位的话程序也会死机的,速度太慢了,而迭代就快得多。

[此贴子已经被作者于2021-2-23 18:55编辑过]

#10
yuma2021-02-23 21:03
回复 9楼 ysr2857
这下结果正确了。验证了你的理论是正确的。
只有本站会员才能查看附件,请 登录
#11
yuma2021-02-23 21:08
回复 9楼 ysr2857
这或许是电脑的算法。

手工计算1.23^3.21次,到底是用高等数学的泰勒公式,还是用什么计算?

拿笔在纸上能计算出来的那种,具体怎么算,我是小学生,版主可以讲讲么?
#12
ysr28572021-02-23 21:20
回复 11楼 yuma
手工计算的话就是前面说的方法,先把1.23乘3次方也就是3个1.23相乘,再乘以1.23的5次方根,手工开5次方根会吗?那得用到二项式定理(高中讲的),太复杂太慢,快速的就是迭代,这个网上可以查到,先求出个初值,略小于实际的,代入迭代公式(具体公式网上去查吧),迭代很少几次就可以得到精确值。
要想把1.23乘以321次方,那就得程序计算的,再开100次方倒是可以用迭代手工计算的,公式原理都是超过中学数学内容的。
简单的近似计算就是上面说的先求1.23的3次方,再乘以1.23的5次方根。
#13
yuma2021-02-23 21:29
先把1.23乘3次方也就是3个1.23相乘,再乘以1.23的5次方根,手工开5次方根??

怎么理解?

1.23^3*[1.23^(1/5)]  ???
#14
ysr28572021-02-23 21:51
回复 11楼 yuma
中学阶段掌握的根式解,一般就是:一个是手工开平方,一个是手工开立方(书上好像没有讲,网上有资料),开立方有道二项式系数:3次项,2次,1次和常数项系数分别是1000(最高次系数省略),300,30,1,每次试商(就是根式结果)都要乘以系数乘以前面的数值的乘方(依次位3(省略),2,1),再相加,跟被开方数比较(与短除法开平方类似),依次得到各位结果,需要每3位分一节,很麻烦,数值小的可以手工算的。比如1234开立方,立方根最高位肯定是1,试商的话下一位1肯定不行,用9试验,234与9*(1^2*300+1*30*9+9*9)=9*651=5859,(刚才写错了,百位和十位数后面要补0的就是要乘以100和10)
显然9太大,依次递减试验得到1*(300+30*1+1*1)=331>234,所以,1234开立方的整数部分为10,小数部分需要在被开立方数后面补0,每一节必须补3个0,与开平方相似。这样依次进行就可以得到结果。11^3=1331.
   当然,可以用迭代法,求出个初值比如10或11,经过迭代(公式自己查一下),几步就可以得到精确的结果,比试商法手工计算快。迭代公式原理对中学生来说不容易理解,需要自己查资料学习研究一下(可能都是大学课程)。

[此贴子已经被作者于2021-2-23 22:23编辑过]

#15
yuma2021-02-23 21:53
回复 14楼 ysr2857
感激,这个我慢慢研究学习。
#16
ysr28572021-02-23 21:56
回复 13楼 yuma
1.23^3.21=1.23^(3+21/100)>1.23^(3+1/5)=1.23^3*1.23^(1/5),所以,这样算出来的是近似值,小于实际,但这样计算简便,略小一点,精确到了点后2位了,所以还是非常接近实际的。
#17
ysr28572021-02-23 22:20
回复 15楼 yuma
刚才14#楼的手工开立方写错了,现在改正过来了,供您参考,其实网上有的,比我说的详细,可以查一下。
#18
cwa99582021-02-25 08:00
你这样的还不是用电脑计算??
1.23^321与1.23^3.21有区别吗?

最好去找找vb的指数函数的算法。

[此贴子已经被作者于2021-2-25 08:04编辑过]

#19
ysr28572021-02-25 10:49
回复 18楼 cwa9958
1.23^3.21近似等于1.23^(3+1/5),这样就可以手工计算了,只要你有耐心不嫌麻烦会手工开5次方的计算。
1