终于找出了问题,double惹的祸
这两天编了一个程序,但是当数据过大时计算结果就会出现错误。对比别人用C#开发的代码后,发现我的算法跟他是一模一样的,但是计算结果出现偏差让我始终找不出问题。我想是不是我的变量定义的类型有错,于是在网上进行搜索,发现确实不少人碰到了这一问题。问题出在 double 数据类型上双精度数值存储实数数值的近似值,而不是准确值。引用网上找来的一段话:
Double 数据类型提供数字可能的最大和最小量值。
Double 的默认值为 0。
编程提示
精度。在处理浮点数字时,请记住浮点数在内存中并不总是有精确的表示形式。 对于某些操作(例如值比较和 Mod 运算符),这可能导致意外的结果。
尾随零。浮点数据类型没有尾随零字符的任何内部表示形式。 例如,它们不能区别 4.2000 和 4.2。 因此,在显示或输出浮点值时,尾随零字符不会出现。
类型字符。将文本类型字符 R 追加到文本会将其强制转换成 Double 数据类型。 例如,如果一个整数值后跟 R,则该值会更改为 Double。
下面是我的代码以及程序计算结果和网上试用版的程序计算结果的对比:
程序代码:
[color=#0000FF]Dimk0 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 编辑 ]