| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 239 人关注过本帖
标题:程序到底是怎么进行计算的?
只看楼主 加入收藏
yuma
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:银河系
等 级:版主
威 望:12
帖 子:1355
专家分:2058
注 册:2009-12-22
结帖率:89.19%
收藏
 问题点数:0 回复次数:18 
程序到底是怎么进行计算的?
下面问题,我问的有点傻。

1.23的3.21次方程序是怎么计算出来的,我想知道手工计算方法.
有没有同学愿意写一下过程?如下图
图片附件: 游客没有浏览图片的权限,请 登录注册






1除以3,再乘以3,程序为什么不会计算出0.9999999999999...
程序如何赋值计算的,知道的同学说下。如下图
图片附件: 游客没有浏览图片的权限,请 登录注册


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

搜索更多相关主题的帖子: 同学 赋值 计算 过程 计算方法 
2021-02-17 17:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:291
帖 子:4624
专家分:28777
注 册:2008-10-15
收藏
得分:0 
1、百度了一个,结果是先那指数转化为分数,分子用来计算整数次幂,然后分母进行开方。

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



授人于鱼,不如授人于渔
早已停用QQ了
2021-02-17 19:30
yuma
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:银河系
等 级:版主
威 望:12
帖 子:1355
专家分:2058
注 册:2009-12-22
收藏
得分:0 
回复 2楼 风吹过b
精辟

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

第一个问题的手工计算方法,我请教过很多大学生,无人能解。

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

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

2021-02-18 00:18
cwa9958
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:22
帖 子:123
专家分:730
注 册:2006-6-25
收藏
得分:0 
好像用泰勒公式展开计算。
可以看作指数函数,f(x)=a^x
2021-02-21 08:52
yuma
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:银河系
等 级:版主
威 望:12
帖 子:1355
专家分:2058
注 册:2009-12-22
收藏
得分:0 
以下是引用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

图片附件: 游客没有浏览图片的权限,请 登录注册

心生万象,万象皆程序!
本人计算机技术站:http://bbs.
6 天前 15:28
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:209
帖 子:2007
专家分:11168
注 册:2014-12-6
收藏
得分:0 
回复 6楼 yuma
你这数学底子好薄啊,请教ysr2857版主肯定没错,他是学数学的。
开方不是光开二次方,你这里需要手动计算开十次方,算法有二分法和牛顿迭代法。二分法比较好懂,迭代法逼近速度快。

能编个毛线衣吗?
6 天前 15:48
ysr2857
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:403
专家分:24
注 册:2020-2-10
收藏
得分:0 
回复 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.
6 天前 18:32
ysr2857
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:403
专家分:24
注 册:2020-2-10
收藏
得分:0 
回复 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编辑过]

6 天前 18:41
yuma
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:银河系
等 级:版主
威 望:12
帖 子:1355
专家分:2058
注 册:2009-12-22
收藏
得分:0 
回复 9楼 ysr2857
这下结果正确了。验证了你的理论是正确的。
图片附件: 游客没有浏览图片的权限,请 登录注册

心生万象,万象皆程序!
本人计算机技术站:http://bbs.
6 天前 21:03
快速回复:程序到底是怎么进行计算的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.096626 second(s), 9 queries.
Copyright©2004-2021, BCCN.NET, All Rights Reserved