| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 645 人关注过本帖
标题:终于找出了问题,double惹的祸
只看楼主 加入收藏
lzxagy
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-8-28
结帖率:66.67%
收藏
 问题点数:0 回复次数:5 
终于找出了问题,double惹的祸
这两天编了一个程序,但是当数据过大时计算结果就会出现错误。对比别人用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 编辑 ]
搜索更多相关主题的帖子: 数据 计算 double 开发 网上 
2012-02-17 22:57
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:0 
不是这样的,double是按IEEE格式保存的,而其它的不是.浮点数都有一个近似值的问题.double的默认值应该是0000000.....00

成功贵在坚持
2012-02-18 18:26
lzxagy
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-8-28
收藏
得分:0 
回复 2楼 mayuebo
在我验证时我觉得就是double的嘛问题。如果位数多的话,他在计算exp或者乘法时,误差就会很大
2012-02-18 22:17
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:0 
不会的,恰恰相反,是更精确

成功贵在坚持
2012-02-19 14:49
lzxagy
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-8-28
收藏
得分:0 
我用了format保留了小数,发现好像又不是double的问题,真不知道问题出在哪里了。
2012-02-21 18:03
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:0 
你的小数一共有几位,如果位数少的话直接用float好了.

成功贵在坚持
2012-02-22 13:16
快速回复:终于找出了问题,double惹的祸
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018848 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved