| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1000 人关注过本帖
标题:[讨论]如何获得高精度的计算结果?
只看楼主 加入收藏
hyhhd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:502
专家分:44
注 册:2006-5-12
收藏
 问题点数:0 回复次数:6 
[讨论]如何获得高精度的计算结果?

系统自带的计算器一样,如何获得高精度的计算结果?

搜索更多相关主题的帖子: 高精度 结果 
2007-05-12 18:45
hyhhd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:502
专家分:44
注 册:2006-5-12
收藏
得分:0 
好像使用double等类型,都没办法!比如Pi只能为"3.14159265357979",而达不到"3.1415926535897932384626433832795",所以计算出来的结果精度就差远了!

2007-05-12 18:48
slore
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1108
专家分:0
注 册:2005-7-1
收藏
得分:0 

模拟人工演算……
Text1 = 精确乘法("154879878712153562312312412312312312313", "123123129598560495834732872487234")
Text2 = 精确加法("154879878712153562312312412312312312313", "123123129598560495834732872487234")

结果:
19069295378885813917158304250971426423928469300045718253568630113512242
154880001835283160872808247045184799547

我把我写的加法的过程给你。。。
Function 精确加法(ByVal 加数 As String, ByVal 被加数 As String) As String
Dim a(), b(), c() As Byte '定义输入和输出数组

Dim 标题 As String
Dim 结果 As String
Dim 加数位数 As Integer, 被加数位数 As Integer, 结果位数 As Integer

标题 = "整数加法"

'加数 = InputBox("请输入被加数:", 标题)
'被加数 = InputBox("请输入加数", 标题)
If 加数 = Empty Then Exit Function
If 被加数 = Empty Then Exit Function
If Not IsNumeric(加数) Then MsgBox "被加数输入错误", , 标题 '检查输入的合法性
If Not IsNumeric(被加数) Then MsgBox "被加数输入错误", , 标题 '检查输入的合法性

加数位数 = Len(加数) '取加数的位数
被加数位数 = Len(被加数) '取被加数的位数
结果位数 = 加数位数 - 被加数位数
'确定结果的最大位数

Dim i As Integer, j As Integer, k As Integer
If 结果位数 >= 0 Then
结果位数 = 加数位数 + 1
ReDim a(加数位数), b(加数位数), c(结果位数) '重定义数组
For i = 被加数位数 + 1 To 加数位数
b(i) = 0
Next i
Else
结果位数 = 被加数位数 + 1
ReDim a(被加数位数), b(被加数位数), c(结果位数) '重定义数组
For i = 加数位数 + 1 To 被加数位数
a(i) = 0
Next i
End If

For i = 1 To 加数位数
a(i) = Mid(加数, 加数位数 - i + 1, 1) '给数组a的每一位赋值
Next i

For i = 1 To 被加数位数
b(i) = Mid(被加数, 被加数位数 - i + 1, 1) '给数组b的每一位赋值
Next i

For i = 1 To 结果位数 '结果数组c初始化
c(i) = 0
Next i

For i = 1 To 结果位数 - 1 '取a,b中的每一位
c(i) = c(i) + a(i) + b(i) '相加结果累加到c中的相应位
If c(i) >= 10 Then 'c中的每一位进位检查
c(i) = c(i) - 10 '本位处理
c(i + 1) = 1
End If
Next i

结果 = Empty
For k = 结果位数 To 1 Step - 1
If c(k) <> 0 Then Exit For '去掉结果中的前导0
Next k
k = IIf(k < 1, 1, k)
For i = k To 1 Step - 1
结果 = 结果 & c(i)
Next i

精确加法 = 结果

'结果 = 加数 & "*" + 被加数 + "=" & 结果
'标题 = "计算结果: " + CStr(加数位数) + "位 * " + CStr(被加数位数) + "位 结果为" + CStr(k) + "位"
'MsgBox 结果, , 标题 '算式和结果输出
End Function


快上课了……
2007-05-12 22:05
hyhhd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:502
专家分:44
注 册:2006-5-12
收藏
得分:0 
谢谢!好像有了一些思路。加减法采用这种方法可以!如果是乘除、指数运算、对数运算、还有三角函数呢!关键是方法和思路。

2007-05-13 12:44
hyhhd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:502
专家分:44
注 册:2006-5-12
收藏
得分:0 
如果转换成二进制计算,然后在转换回来,不知如何?

2007-05-13 12:46
hgp4522069
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-4-8
收藏
得分:0 
我把我的精确除法发给你吧
思路:
比如用a/b,要得到一百位
option base 1
'计算1到100位上的数值
dim a(100) as integer
for i=1 to 100
a(i)=int(a/b)
a=(a mod b)*10
next i
2007-05-14 01:00
hyhhd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:502
专家分:44
注 册:2006-5-12
收藏
得分:0 
非常感谢,我先研究一下。

2007-05-14 12:51
快速回复:[讨论]如何获得高精度的计算结果?
数据加载中...
 
   



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

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