注册 登录
编程论坛 VB6论坛

为什么调试的时候总是提示我说xt = tana / (2 * a * u)这除数为0

hongxiang900 发布于 2015-03-27 10:31, 756 次点击
求帮忙看一下呗,真心谢谢了,找不到哪里出错
Dim tana, delta, step, u, texpr, xp, yp, xt, yt, k, xb, yb, del As Double
Dim xa, ya As Single


Private Sub Command1_Click()
a = Val(Text1.Text)
m = Val(Text3.Text)
xa = Val(Text6.Text)
Text4.Text = "xb=" & Str(xb) & vbCrLf & "yb=" & Str(yb)
ya = a * x ^ 2
For tana = delta To 0.00001 Step m
u = Sqr(delta ^ 2 - tana ^ 2)
texpr = 4 * a * u ^ 3 + 4 * a * u * tana ^ 2 - 4 * a * u ^ 2 * ya - tana ^ 2 + 4 * a * u * tana * xa
If texpr < 0.00001 And texpr > 0 Then Exit For
Next
xp = xa + tana: yp = ya + u
xt = tana / (2 * a * u): yt = a * xt ^ 2
k = (yp - yt) / (xp - xt)
del = Sqr(k ^ 2 - 4 * a * (k * xa - ya))
xb = (k + del) / (2 * xa)
yb = a * xb ^ 2
End Sub
13 回复
#2
hongxiang9002015-03-27 10:33
求帮忙看看呗,谢谢各位大神了,我是刚开始学习,正在编算法
#3
wp2319572015-03-27 10:37
自己看呗

xt = tana / (2 * a * u)  如果除数是0  那么a 或 u 必有一个是0  再往上返a u
#4
hongxiang9002015-03-27 11:08
回复 3楼 wp231957
嗯嗯,是啊,可是我赋值的什么都不是零,我自己觉得只能是u那用根号求值时他自己给弄成零了,可能是数太小,那怎么样改啊
#5
hongxiang9002015-03-27 11:27
只有本站会员才能查看附件,请 登录
#6
hongxiang9002015-03-27 11:27
就是要求b点的坐标,利用各种方程
#7
lianyicq2015-03-27 11:30
开方出来会比这个更小?
Dim i As Double
i = Sqr(9.88131291682493E-324)
Form1.Print i
Form1.Print 1 / i
没仔细看,参考这个
http://www.

[ 本帖最后由 lianyicq 于 2015-3-27 11:35 编辑 ]
#8
hongxiang9002015-03-27 11:42
回复 7楼 lianyicq
不会比这个小,你这个更小,可是我这哪里错了啊
#9
hongxiang9002015-03-27 11:42
回复 7楼 lianyicq
我就是参考的这个,可是出错了
#10
lianyicq2015-03-27 11:50
建议加option explicti
另外delta没赋值
#11
lianyicq2015-03-27 11:53
注意看这两行
...
For tana = delta To 0.00001 Step m
u = Sqr(delta ^ 2 - tana ^ 2)
...
第一次执行时tana=delta,当然u=0
....
不知道原理你看没有。文本框内的值不能随意写,圆半径由大至小测试,显然步长为负,而且必须每次更新tana

[ 本帖最后由 lianyicq 于 2015-3-27 12:13 编辑 ]
#12
xzlxzlxzl2015-03-27 12:09
用直线方程必须考虑斜率无穷大的情况。
#13
hongxiang9002015-03-27 13:52
回复 10楼 lianyicq
在哪里加啊,我那个delta赋值是自己输入,我弄了个文本框,是自己输入数值
#14
lianyicq2015-03-30 16:49
Option Explicit
Private Type coordinate
x As Double
y As Double
End Type
Dim A As coordinate, B As coordinate, P As coordinate, T As coordinate
Dim parameter_a As Double
Dim r As Double
Dim s As Double
Private Sub Command1_Click()
Dim parameter_t As Double
Dim t_test As Double
Dim u As Double
Dim k As Double
Dim delta As Double

For parameter_t = r - s To 0 Step -s
  u = Sqr(r ^ 2 - parameter_t ^ 2)
  t_test = 4 * parameter_a * u ^ 3 - 4 * parameter_a * u ^ 2 * A.y - parameter_t ^ 2 + 4 * parameter_a * u * parameter_t ^ 2 + 4 * parameter_a * u * parameter_t * A.x
  If t_test > 0 And t_test < s Then Exit For
Next
P.x = A.x + parameter_t
P.y = A.y - u

T.x = parameter_t / (2 * parameter_a * u)
T.y = parameter_a * T.x ^ 2
k = (P.y - T.y) / (P.x - T.x)
delta = Sqr(k ^ 2 - 4 * parameter_a * (k * A.x - A.y))
B.x = (k + delta) / (2 * parameter_a)
B.y = parameter_a * B.x ^ 2
Form1.Print P.x & "," & P.y
Form1.Print k & "," & 180 * Atn(k) / 3.14 & "度"
Form1.Print T.x & "," & T.y
Form1.Print B.x & "," & B.y
End Sub
Private Sub Text1_Change()
parameter_a = Val(Text1.Text)
End Sub
Private Sub Text2_Change()
r = Val(Text2.Text)
End Sub
Private Sub Text3_Change()
A.x = Val(Text3.Text)
A.y = parameter_a * A.x ^ 2
Text4.Text = A.y
End Sub
Private Sub Text5_Change()
s = Val(Text5.Text)
End Sub

说明一下
text1是y=ax^2的a值比如0.2 text2是圆半径比如0.1 text3是A点横坐标比如2 text4是自动计算A点纵坐标 text5是测试步长比如0.0001

[ 本帖最后由 lianyicq 于 2015-3-30 16:53 编辑 ]
1