注册 登录
编程论坛 VB6论坛

VB高精度除法

柴胡颗比克 发布于 2020-04-25 00:51, 4876 次点击
高精度除法,是要整数部分和小数部分分开求吗。难吐我了,有些地方一直卡着。
21 回复
#2
柴胡颗比克2020-04-25 00:53
希望大家帮帮忙。😂我觉得好难 ,想了我好久。
#3
柴胡颗比克2020-04-25 09:45
一直卡思路,手里头也没啥资料。希望,大佬们帮助!高精度除法的计算,保留200位小数部分。我分段截取,小数,小数一直显示溢出。啊。
#4
ZHRXJR2020-04-25 11:38
VB的除法非常简单,C = A / B ,关键是 B 不能为 0 ,C 的数据类型必须是小数数据,也就是浮点数数据,即单精度数据或双精度数据,这样就没有问题,小数与整数都能够计算出来。
例如
Dim A As Single, B As Single, C As Single   '都定义为单精度数据
A = 554: B = 33
C = A / B
计算出来 C = 16.78788
#5
wmf20142020-04-25 14:07
仿竖式除法,一路除下去,应该不难吧。
#6
柴胡颗比克2020-04-25 16:22
回复 5楼 wmf2014
😂emm,我觉得好难。就一直不知道怎么保留200位小数部分。而且题目还要求小数部分的格式需要是每行二十个。😂
#7
ZHRXJR2020-04-25 19:02
双精度数据虽然是在正负4.940656458412247E-324到正负1.79769313486232E308 之间,但在VB程序中内存只占16个字节,因此在大数据运算时是以科学计数法显示的,要显示小数后200位应该有困难,估计是内存本身存储的字节数就已经限制了。
例如
Dim A As Double, B As Double, C As Double
A = 0.000000000003: B = 25647891235468
C = A / B
 C 的值显示为 1.16968680678564E-25  有效部分是16位
#8
柴胡颗比克2020-04-25 19:32
回复 7楼 ZHRXJR
我们老师给的建议是利用仿竖式除法,但我不懂。😂代码只能写的输出16位。
#9
wmf20142020-04-25 20:31
要看你除数和被除数的数据范围,如果是在0--2147483648范围内就用普通除法达到200位小数的精度还是比较容易的,如果是任意位数则需要单独写大数加减乘除函数完成。
下述函数可以精确到小数点后面200位(用最像无理数的1/49为例):
程序代码:
Function div_high_sigle(a As Long, b As Long) As String
  Dim i As Long, j As Long, k As Long, c As String
  k = Int(a / b)
  j = a Mod b
  c = k & "."
  While i < 200
    j = j * 10
    While j < b
      c = c & "0"
      j = j * 10
      i = i + 1
    Wend
    c = c & Int(j / b)
    j = j Mod b
    i = i + 1
  Wend
  div_high_sigle = c
End Function

Private Sub Command1_Click()
  Text1 = ""
  Text1 = div_high_sigle(1, 49)
  MsgBox Len(Text1)
End Sub


1/49的结果如下(循环节长度42位,楼主可自己数一下):
0.02040816326530612244897959183673469387755102040816326530612244897959183673469387755102040816326530612244897959183673469387755102040816326530612244897959183673469387755102040816326530612244897959183673


[此贴子已经被作者于2020-4-25 21:06编辑过]

#10
ZHRXJR2020-04-25 22:11
柴胡颗比克:wmf2014 的方法是利用小数与整数分离得到一个字符串从而取得小数后200位,值得学习。
#11
柴胡颗比克2020-04-25 23:17
回复 10楼 ZHRXJR
嗯嗯!也谢谢你啦!
#12
柴胡颗比克2020-04-25 23:18
回复 9楼 wmf2014
那我去试试!谢谢你!
#13
柴胡颗比克2020-04-25 23:46
回复 9楼 wmf2014
谢谢你!!!还有我想问一下,如果需要将小数点后面的小数部分进行格式化,如,一行输出10个或20个值,并且一个字符一个空格,是需要用计数器实现嘛。
#14
柴胡颗比克2020-04-25 23:47
明天就结贴。
#15
wmf20142020-04-26 12:15
回复 13楼 柴胡颗比克
感觉你问的不是vb问题,应该是c或python控制台下的问题,要用print输出?有点编程基础的,按你要求的格式输出不是问题,下面代码对昨天代码优化了,计算速度有很大提升(溢出危险大,除数不大于10000就没问题)。
程序代码:
Function div_high_sigle(a As Long, b As Long) As String
  Dim i As Long, j As Long, k As Long, c As String
  k = Int(a / b)
  j = a Mod b
  c = k & "."
  For i = 0 To 49
    j = j * 10000
    c = c & Format(Int(j / b), "0000")
    j = j Mod b
  Next
  div_high_sigle = c
End Function

Private Sub Command1_Click()
  Text1 = ""
  Text1 = div_high_sigle(1, 49)
End Sub


[此贴子已经被作者于2020-4-26 12:17编辑过]

#16
柴胡颗比克2020-04-26 16:07
回复 15楼 wmf2014
这个题目原本是c语言的练习题,我们老师让我们用VB写出来。😂谢谢啦!
#17
柴胡颗比克2020-04-26 16:08
我不是计算机专业的,不过VB是必修课,所以编程基础,emm.😂
#18
ysr28572020-05-08 22:23
回复 13楼 柴胡颗比克
修改了一下代码,小数点后5个字符隔一个空格,20个字符换一行:
Function div_high_sigle(a As Long, b As Long) As String
  Dim i As Long, j As Long, k As Long, c As String
  k = Int(a / b)
  j = a Mod b
  c = k & "."
  For i = 0 To 49
    j = j * 10000
    c = c & Format(Int(j / b), "0000")
    j = j Mod b
  Next
  div_high_sigle = c
End Function

Private Sub Command1_Click()
Dim a
  Text1 = ""
  a1 = div_high_sigle(1, 49)
  a = Mid(a1, 3) '取小数点后的数字
  a2 = Left(a1, 2)
  Do While Len(a) > 0
  k = k + 1
  b = Mid(a, 1, 1)
  If k Mod 5 = 0 Then
  b1 = b1 & b & " "
  ElseIf k Mod 20 = 0 Then
  b1 = b1 & b & vbCrLf
  Else
  b1 = b1 & b
  End If
  a = Mid(a, 2)
  Loop
  Text1 = a2 & b1
End Sub


[此贴子已经被作者于2020-5-8 22:37编辑过]

#19
ysr28572020-05-08 23:55
下面是此程序计算的1/997的结果,倒数第34位开始循环了:(把可调用代码中的a,b分别输入1,997即可)
0.00100 30090 27081 24373
 11935 80742 22668 00401
20361 08324 97492 47743
 22968 90672 01604 81444
33299 89969 90972 91875
62688 06419 25777 33199
59879 63891 67502 50752
 25677 03109 32798 39518
55566 70010 03009 02708
12437 31193 58074 22266
如下是程序:(程序还是有问题,换不了行,需要调整,希望老师指点)
Function div_high_sigle(a As Long, b As Long) As String
  Dim i As Long, j As Long, k As Long, c As String
  k = Int(a / b)
  j = a Mod b
  c = k & "."
  For i = 0 To 49
    j = j * 10000
    c = c & Format(Int(j / b), "0000")
    j = j Mod b
  Next
  div_high_sigle = c
End Function

Private Sub Command1_Click()
Dim a
  Text1 = ""
  a1 = div_high_sigle(1, 997)
  a = Mid(a1, 3) '取小数点后的数字
  a2 = Left(a1, 2)
  Do While Len(a) > 0
  k = k + 1
  b = Mid(a, 1, 1)
  If k Mod 5 = 0 Then
  Text1 = Text1 & b & " "
  ElseIf k Mod 20 = 0 Then
  Text1 = Text1 & b & vbCrLf
  Else
  Text1 = Text1 & b
  End If
  a = Mid(a, 2)
  Loop
  Text1 = a2 & Text1
End Sub

#20
ysr28572020-05-09 00:41
这回对了,先换行再隔离空格,否则换不了行了,程序改定如下:
Function div_high_sigle(a As Long, b As Long) As String
  Dim i As Long, j As Long, k As Long, c As String
  k = Int(a / b)
  j = a Mod b
  c = k & "."
  For i = 0 To 49
    j = j * 10000
    c = c & Format(Int(j / b), "0000")
    j = j Mod b
  Next
  div_high_sigle = c
End Function

Private Sub Command1_Click()
Dim a
  Text1 = ""
  a1 = div_high_sigle(1, 49)
  a = Mid(a1, 3) '取小数点后的数字
  a2 = Left(a1, 2)
  Do While Len(a) > 0
  k = k + 1
  b = Mid(a, 1, 1)
  If k Mod 20 = 0 Then
  b1 = b1 & CStr(b) & vbCrLf
  ElseIf k Mod 5 = 0 Then
  b1 = b1 & CStr(b) & " "
  Else
  b1 = b1 & CStr(b)
  End If
  a = Mid(a, 2)
  Loop
  Text1 = a2 & b1
End Sub
'快速计算1/49能精确到点后200位的程序。
#21
ysr28572020-05-09 00:45
程序计算结果如下:
0.02040 81632 65306 12244
89795 91836 73469 38775
51020 40816 32653 06122
44897 95918 36734 69387
75510 20408 16326 53061
22448 97959 18367 34693
87755 10204 08163 26530
61224 48979 59183 67346
93877 55102 04081 63265
30612 24489 79591 83673
#22
zgzzsn2020-05-11 12:07
赞一个
1