| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4252 人关注过本帖
标题:float and UINT转换问题
只看楼主 加入收藏
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 10楼 Juson
printf();出来的值是正确的~但是我不要printf();
直接看内存数值~证实b值确实已被改变~这要如何补救?
原本是90 2A E6 3F~转换后变成91 2A E6 3F
图片附件: 游客没有浏览图片的权限,请 登录注册

不要投我
2013-04-10 15:28
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
那我若忽略这个误差~
另一个问题是~我要如何将这4个字直接从内存中取出~
printf();内存中 91 2A E6 3F 这4个字?

不要投我
2013-04-10 15:55
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
以上基本需求我全都已经做到了~
现在是要提高精确度减少误差简化程序代码
毕竟程序要做上百万次转换~

不要投我
2013-04-10 16:03
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
回复 11楼 yz1025
由于系统的栈的生长方向是向下的,也就是数据存储是向着地址编码降低的方向进行的,所以对于变量在内存中的存储“91 2a e6 3f”应该倒着看,也就是"3f e6 2a 91“,而你说的原来的地址”90 2a e6 3f“,实际是"3f e6 2a 90“,如果你了解浮点数的表示方法就会知道”3f e6 2a 91“ 和”3f e6 2a 90“ 这两个单精度浮点数仅仅是差了一个 2^(-23),误差很小的,接近千万分之一,产生这个误差的原因是atof函数返回的是double型,而变量b是float型,在把double类型数据转换成float数据时,由于double型比float型数据位长,而在截取数据时进行的0舍1入造成的微小偏差


[ 本帖最后由 Juson 于 2013-4-11 01:48 编辑 ]
2013-04-11 01:21
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
感谢您的回覆~您说的这些我都知道~指是因为版上有9成以上都是学生~
一下子问太难的我怕又得解释半天~所以我直接省略前段把最关键的部分~
拿出来问~毕竟程式已经完成2年多了~回归主题~

误差问题:
如果说考试时一题算术题答案明明是0~甲生写1~被教授打0分~
你觉得甲生可以去跟教授说只差1~好歹也给一半分数吧~您说有可能吗?

再说如果1.798174的单位是A~但是客户要看的是nA的~那一经转换后~
1.798174 A = 1.798174*(10 ^9)=> 1798174000 nA 和
1.79817 A = 1.79817*(10 ^ 9)=> 1798170000 nA
1798174000 - 1798170000 = 4000(此时还只差1吗?)
差了1就天差地远了~

既然atof();有问题~那还是尝试使用二进位转换去取值比较保险~
只是不想搞得那么麻烦~想偷懒而已~

再说原本1.798174是小数点后6位数~进了atof();转出后~即使回传Double型~
但是精度增加再转回float型~至少还是得保有6位数~为啥变5位?
少一位这并不符合float型后显示6位数的规则~(IEEE 754)
这并不符逻辑~是我编程上有什么地方有遗漏吗?

不要投我
2013-04-11 07:24
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
回复 15楼 yz1025
浮点数只有有效位数是确定的,而小数位是不固定的,你说的的浮点数有6位小数只是在打印的时候用格式转换符%f打印出来默认有6位小数,并不是浮点数都精确到小数点后6位,它可以保留10位,也可以保留1位。
对于那个变量b,你也看到它在内存里面的值就是3F E6 2A 91, 写成十进制是1.798174024....后面还有好多小数,而VC里面显示b = 1.79817应该是保留5位小数后得到的数,你既然不相信printf函数打印出来的数,那么你就肯定VC显示出来的值一定是精确的值吗。你可以验证一下看看(只是推断),把A改成1.798176,然后再查看VC显示的b的值,它应该是1.79818。
float只有6-7位数字是有效的,如果你非要把数据表示的那么精确,那你为什么不用double或者long double呢


[ 本帖最后由 Juson 于 2013-4-11 14:17 编辑 ]
2013-04-11 14:09
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:0 
你们研究的好高深

人生是一场错过 愿你别蹉跎
2013-04-11 14:22
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 16楼 Juson
不是我不相信printf();出來的值~是我必須用b值去做其他運算~
所以就算printf();出來是對的~b值錯我的運算結果還是錯~

不要投我
2013-04-11 19:37
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
回复 18楼 yz1025
b的值怎么错了?b的值就是3F E6 2A 91,你觉得b的值等于多少才是对的

[ 本帖最后由 Juson 于 2013-4-11 19:54 编辑 ]
2013-04-11 19:51
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
用double或者long double
我試過差更多~精度很高沒錯~就如你所說他後面小數都亂跳的~
這關係到補數運算後產生的數字~也等於和原始檔16進制值越差越遠~
問題只在於B值明明有6位~依規範也是6位~但是ATOF();後卻只剩5位~
差1個數字轉成16進制時~就更天差地遠~而且今天有嘗試轉更小的數值~
轉成16進制後~兩邊就不只差1了~

不過唯一欣慰的是~錯誤不會累積~只是兩邊永遠對不上~
這又是一個VC6神奇的地方~因為精度不同~換算出來的值也每次都不同~
但是轉回10進制時~卻又變成相同~這我可能要跟上游反應一下~
不然值灌上電壓電流單位後~差上幾千~這足夠讓一台幾千萬的機器燒掉了~

不要投我
2013-04-11 19:52
快速回复:float and UINT转换问题
数据加载中...
 
   



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

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