注册 登录
编程论坛 VB6论坛

终于找出了问题,double惹的祸

lzxagy 发布于 2012-02-17 22:57, 647 次点击
这两天编了一个程序,但是当数据过大时计算结果就会出现错误。对比别人用C#开发的代码后,发现我的算法跟他是一模一样的,但是计算结果出现偏差让我始终找不出问题。我想是不是我的变量定义的类型有错,于是在网上进行搜索,发现确实不少人碰到了这一问题。问题出在 double 数据类型上双精度数值存储实数数值的近似值,而不是准确值。
引用网上找来的一段话:
Double 数据类型提供数字可能的最大和最小量值。

Double 的默认值为 0。

编程提示

精度。在处理浮点数字时,请记住浮点数在内存中并不总是有精确的表示形式。 对于某些操作(例如值比较和 Mod 运算符),这可能导致意外的结果。
尾随零。浮点数据类型没有尾随零字符的任何内部表示形式。 例如,它们不能区别 4.2000 和 4.2。 因此,在显示或输出浮点值时,尾随零字符不会出现。

类型字符。将文本类型字符 R 追加到文本会将其强制转换成 Double 数据类型。 例如,如果一个整数值后跟 R,则该值会更改为 Double。

下面是我的代码以及程序计算结果和网上试用版的程序计算结果的对比:
程序代码:
[color=#0000FF]Dim k0 As Double
Dim k1 As Double
Dim pt As Double
Dim p15 As Double
Dim p155 As Double
Dim a As Double
Dim p As Double
Dim t1 As Double     ''''''''''''''''''''''视温

Dim vcf15 As Double
If p <= 770 And p >= 653 Then   
k0 = 346.4228
k1 = 0.4388



pt = p * (1 - 2.3 * 10 ^ (-5) * (t1 - 20) - 2 * 10 ^ (-8) * (t1 - 20) * (t1 - 20))

p15 = pt
Do

p155 = p15
a = k0 / (p155 * p155) + k1 / p155

vcf15 = Exp(-a * (t1 - 15) * (1 + a * (t1 - 15) * 0.8))
p15 = pt / vcf15


Loop Until Abs(p15 - p155) < 0.005
[/color]

代码在计算40℃以下视温时,没有一点错误。但是当视温过高时,计算结果就出现错误,为什么我的计算结果就会不正确呢。

我的计算结果如下:
只有本站会员才能查看附件,请 登录

网上下载的试用版的计算结果如下:
只有本站会员才能查看附件,请 登录


我的计算结果如下:
只有本站会员才能查看附件,请 登录

网上下载的试用版的计算结果如下:
只有本站会员才能查看附件,请 登录


[ 本帖最后由 lzxagy 于 2012-2-21 18:00 编辑 ]
5 回复
#2
mayuebo2012-02-18 18:26
不是这样的,double是按IEEE格式保存的,而其它的不是.浮点数都有一个近似值的问题.double的默认值应该是0000000.....00
#3
lzxagy2012-02-18 22:17
回复 2楼 mayuebo
在我验证时我觉得就是double的嘛问题。如果位数多的话,他在计算exp或者乘法时,误差就会很大
#4
mayuebo2012-02-19 14:49
不会的,恰恰相反,是更精确
#5
lzxagy2012-02-21 18:03
我用了format保留了小数,发现好像又不是double的问题,真不知道问题出在哪里了。
#6
mayuebo2012-02-22 13:16
你的小数一共有几位,如果位数少的话直接用float好了.
1