| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4252 人关注过本帖
标题:float and UINT转换问题
取消只看楼主 加入收藏
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
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 16楼 Juson
不是我不相信printf();出來的值~是我必須用b值去做其他運算~
所以就算printf();出來是對的~b值錯我的運算結果還是錯~

不要投我
2013-04-11 19:37
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
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 19楼 Juson
图片附件: 游客没有浏览图片的权限,请 登录注册


1.798174才是對的~後面少個4就不對了~

3F E6 2A 91 是我依照b值再去運算出來的結果~

[ 本帖最后由 yz1025 于 2013-4-11 19:57 编辑 ]

不要投我
2013-04-11 19:54
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
這問題先前部門內部有討論過~系統用VB6並依照IEEE754規範~
進行二進制處理後出來的值~和呼叫API等於VC6的處理就是不一樣~
程序代码:
TmpStrToDBL = CDbl(TmpStr)
LogNum = 10 ^ Log10(TmpStrToDBL)
IEEE32bit = sign * CSng(Mid(CStr(TmpStrToDBL / LogNum), 1, 9) * LogNum)

 
ptr1 = VarPtr(IEEE32bit)
ptr2 = VarPtr(tmpb(0))

 
CopyMemory ByVal ptr2, ByVal ptr1, 4
Debug.Print "new. " & tmpb(0) & " " & tmpb(1) & " " & tmpb(2) & " " & tmpb(3)

這次我直接全程用VC6處理~差異還是在~

不要投我
2013-04-11 20:04
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 22楼 Juson
所以我之前有问过怎么直接把内存的3F E6 2A 91撷取出来~这样我就不用手动转换了~

不过直接看内存资料~同一个值1.798174~
原始是3F E6 2A 90 (这我第一篇就写了)
变成是3F E6 2A 91
连内存资料都不同就已无力回天了~

不要投我
2013-04-11 20:11
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
想开一点只要确认不是我程式造成的误差问题~
就没我的事了~只是纠结~郁闷~
STDF<->ATDF两个档案互转程序今天完成了~

不要投我
2013-04-11 20:15
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
以下是引用Juson在2013-4-11 20:13:31的发言:

没学过vb,不知道你们这段代码要怎样数据


这段是在VB6中呼叫API处理符点数的程序~速度快~
原本是一步一脚印的用字节阵列以二进位方式算的~
程序相较之下有点长~所以没贴上~速度慢~差距将进30倍~
但是用API(VC6)会和系统有误差~所以就搁置了~

不要投我
2013-04-11 20:19
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
以下是引用yz1025在2013-4-11 20:15:11的发言:

想开一点只要确认不是我程式造成的误差问题~
就没我的事了~只是纠结~郁闷~
STDF<->ATDF两个档案互转程序今天完成了~


底层算是完成一半吧~再来就是要建模了~底层完成后~
就要开始设计使用者介面~程式流程控制~后段的资料分析运算~

不要投我
2013-04-11 20:28
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
1.798174
1.7981743999
1.798174399413186456
....
每个最后转出的16进制都不同~
但是转成10进制浮点数都相同~

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



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

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