难题!解出来100分奉送!

upsuper 2005-09-17 08:30:41
我现在又需要进行高精度小数运算(Double不够用),我使用了Variant/Decimal。但是现在我需要用到开平放,但sqr函数不能提供精度达到Decimal的运算。求如何能开Decimal的平方?
...全文
281 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AV_GIRL 2005-09-18
  • 打赏
  • 举报
回复
手动开平方吗?
zhuaiman 2005-09-17
  • 打赏
  • 举报
回复
Mark
VBDN 2005-09-17
  • 打赏
  • 举报
回复
/关注/
还想懒够 2005-09-17
  • 打赏
  • 举报
回复
曾经讨论过大数相乘的算法,楼主可以找找相关的贴子,Decimal的开方运算即为两个大数相乘,至于乘出来以后的小数点,那是小学的基础知识了。

可将大数按位分设于数组中,自己写一个乘法的算法。
upsuper 2005-09-17
  • 打赏
  • 举报
回复
能否不调用计算器?我想要算法。希望能快速~
northwolves 2005-09-17
  • 打赏
  • 举报
回复
参看拙作:

http://blog.csdn.net/northwolves/archive/2004/10/24/149862.aspx

Sendkeys 和 Sendmessage 使用技巧一例
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Function sqrx(ByVal x As Double) As String '计算平方根(比VB DOUBLE 类型精度高)
Dim temp As String, i As Long, j As Long
Shell "Calc.EXE", vbMinimizedNoFocus '运行计算器
temp = x & "y0.5="
For i = 1 To Len(temp)
SendKeys Mid(temp, i, 1), True '向计算器顺序发送按键消息X (X^Y) 0.5=
Next
temp = String(64, Chr(0))
i = FindWindow(vbNullString, "计算器") '窗口句柄
j = FindWindowEx(i, ByVal 0&, "Edit", vbNullString) '编辑框句柄
SendMessage j, &HD, Len(temp), ByVal temp '发送编辑框文本至temp
SendKeys "%{F4}", True '调用ALT+F4关闭计算器窗口
sqrx = temp
End Function

Private Sub Command1_Click()
Dim i As Integer
For i = 17 To 24
Debug.Print "sqrx(" & i & ")=" & sqrx(i)
Next
End Sub



返回:
sqrx(17)=4.1231056256176605498214098559741
sqrx(18)=4.2426406871192851464050661726291
sqrx(19)=4.3588989435406735522369819838596
sqrx(20)=4.4721359549995793928183473374626
sqrx(21)=4.582575694955840006588047193728
sqrx(22)=4.6904157598234295545656301135445
sqrx(23)=4.7958315233127195415974380641627
sqrx(24)=4.8989794855663561963945681494118
jxgzay 2005-09-17
  • 打赏
  • 举报
回复
sqr(x)
x^(1/2)
upsuper 2005-09-17
  • 打赏
  • 举报
回复
我现在有需要进行高精度小数运算(Double不够用),我使用了Variant/Decimal。但是现在我需要用到开平方,但sqr函数不能提供精度达到Decimal的运算。求如何能开Decimal的平方?
thirdapple 2005-09-17
  • 打赏
  • 举报
回复
如果不嫌慢,可以模拟开平方法
province_ 2005-09-17
  • 打赏
  • 举报
回复
所谓无限位其实就是我说的高精度算法,两个操作数都放到数组里,循环做运算,规则其实大家都学过,就是小学里的竖式运算。不过加减乘除都要自己来实现。
upsuper 2005-09-17
  • 打赏
  • 举报
回复
这个函数可以提供高达28位的开方运算~
不过我同学说有无限位开方算法,利用字符储存。
拿到了在于大家分享~
upsuper 2005-09-17
  • 打赏
  • 举报
回复
自解,代码写出来大家看看,还有什么更好的改进意见:
Public Function sqrx(dInput)
Dim a, max, min
a = (dInput + 1) / 2
max = a
min = 0
Do Until Abs(a * a - dInput) <= 3E-28 '精度数值,事实上经过测试,精度数值调整到5E-28可以得到同样的答案,但最佳数值在测试中是3E-28
If a * a > dInput Then
max = a
ElseIf a * a < dInput Then
min = a
ElseIf a * a = dInput Then
Exit Do
End If
a = (min + max) / 2
Loop
sqrx = a
End Function
province_ 2005-09-17
  • 打赏
  • 举报
回复
这个问题是需要你懂高精度乘高精度及高精度除以低精度数才能解决,难度有点,答案是通过迭代逼近来得出的,写写比较麻烦,你可以参考程序算法一类的书。不过对你练内功很有好处。
upsuper 2005-09-17
  • 打赏
  • 举报
回复
不懂,请赐教

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧