| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1963 人关注过本帖
标题:程序没问题但是结果不对
只看楼主 加入收藏
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
无论计算与否,浮点数还是存在不能精确转换为字符串的问题,比如你输入-1.1499999时,不计算的输出会是-1.1500000.
估计根据浮点数的表示格式做智能判断可做到90%的正确。以double类型为例(c语言的double标准):c double类型以52位2进制位表示53位有效位(最高位恒为1),因此最高精度数为2^52约为4.5*10^16,大致可理解为小数点后15个有效位,通过判断从第15位开始往左判断,连续的9则对不为9的数进一位,连续的0则舍弃。
    输入               double
-1.15                 -1.149999999999999 连续13个9,则对小数点后15-13=2个数4进位为5,转换结果即-1.15
-1.149999             -1.149998999999999 连续10个9,则对小数点后15-9=6个数8进位为9,转换结果即-1.149999
-1.11                 -1.110000000000000 连续13个0,舍弃,转换结果为-1.11
-1.13                 -1.129999999999999 连续13个9,则对小数点后15-13=2个数2进位为3,转换结果即-1.13

能编个毛线衣吗?
2016-02-18 14:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()進來的就是字符串,字符串輸入、字符串輸出,何需運算,一點誤差都沒有。如果本來就是二進制數據輸入,也不用多少運算,直接裁掉.前面的部分就是了。

授人以渔,不授人以鱼。
2016-02-18 17:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1樓的代碼,用那麽多浮點庫函數,還用了malloc(),最低效的東西都用上了。

授人以渔,不授人以鱼。
2016-02-18 18:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
對二進制(double或float)無法精確表達的數値,樓主的這個求取小數點後數字的需求本身就沒意義,因爲這與取的位數有關,但取位數有printf()格式化代勞,所以實際上哪種情況下都不需要做數學運算。你最終都要調用printf(),不是在前面做一大堆計算就説printf()低效的,它再低效你也要用它一次,何必不直接讓它做了。

授人以渔,不授人以鱼。
2016-02-18 18:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
double和long double都祇有10位有效數字

授人以渔,不授人以鱼。
2016-02-18 18:45
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 15楼 TonyDeng
我知道Tony版主一言九鼎,任何观点肯定都有出处。
但根据我对浮点数的理解及资料及实验,double类型数据有效位为10进制数16位,小数点后15位应该没错,同时给出一个百度来的资料如下(当然Tony版主从来认为百度的内容大部分鱼目混珠,但就这个博主的分析,以我并不精深的知识来看,表示很赞同):
http://blog.
...目前C/C++编译器标准都遵照IEEE制定的浮点数表示法...
...单精度的底数只存储23位, 即最小一位为 1/2^23, 故精度为 1/2^23 = 1.19209e-7, 可精确到小数点后6位; 双精度的底数存储52位, 最小位为 1/2^52, 精度为 1/2^52 = 2.22045e-16, 能精确到小数点后15位...


另:就事论事,1楼题意就是double转换为字符串不精确,和输出不一致的问题,如果直接输入字符串应该不合题意吧,当然这类转换非要精确意义不大。

[此贴子已经被作者于2016-2-18 19:32编辑过]


能编个毛线衣吗?
2016-02-18 19:26
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 11楼 wmf2014
奥,那版主,是不是我要是遇到这种情况,想保留几位有效小数可以认为的在后面加上0.00...x,确保最后一位是我想要的那个数。
2016-02-22 10:37
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 14楼 TonyDeng
版主大大,这些我都知道,但是,题目要求这样,我也没有办法。
2016-02-22 10:39
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 16楼 wmf2014
wmf2014大大,谢谢,看来还是我没把问题说清楚呀
2016-02-22 10:40
快速回复:程序没问题但是结果不对
数据加载中...
 
   



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

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