亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3929 | 回復: 6
打印 上一主題 下一主題

[C] C浮點數(shù)的精度問題 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-11-29 16:13 |只看該作者 |倒序瀏覽
業(yè)務代碼里有這么一段代碼
int sample(double a)
{
    ...
    int x;
    x = a * 100;
    ...
}
發(fā)現(xiàn)在a = 37.30或者10.20的時候x得不到想要的值。x的結果會變成3729和1029

寫了個測試代碼如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     double test = 37.30;
  5.     double test2 = 10.20;
  6.    
  7.     int i = 100;
  8.     for(; i < 1000000; i*=10) {
  9.         printf("%.2f * %d =  %d\n", test, i, (int)(test * i));
  10.         printf("%.2f * %d = %d\n", test2, i, (int)(test2 * i));
  11.     }   
  12.     return 0;
  13. }
復制代碼
輸出如下:
/home/xlc/DemoCode> ./floattest                  
37.30 * 100 =  3729
10.20 * 100 = 1019
37.30 * 1000 =  37300
10.20 * 1000 = 10200
37.30 * 10000 =  373000
10.20 * 10000 = 102000
37.30 * 100000 =  3729999
10.20 * 100000 = 1019999

在win7 64bit vs2013 下面和gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)都得到相同的結果

我知道浮點數(shù)不會精確表示。但是為何偏偏是這兩個數(shù)出問題?
各位有遇到過沒?

PS:目前我想是先改成 x = (int)(a * 1000) / 10;

論壇徽章:
0
2 [報告]
發(fā)表于 2014-11-29 16:33 |只看該作者
如果x是double肯定沒問題,但樓主你的x是int,double轉(zhuǎn)int最好用round,這樣應該就沒問題了。

另外樓主可以把a改成37.300和10.200試試。

論壇徽章:
0
3 [報告]
發(fā)表于 2014-11-29 16:38 |只看該作者
本帖最后由 c04n05 于 2014-11-29 17:08 編輯

回復 2# xphh2008
感謝關注。我試過37.300和10.200問題依舊。要用整形也是前輩們的業(yè)務代碼這么弄的。



   

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
4 [報告]
發(fā)表于 2014-11-29 17:06 |只看該作者
應該跟浮點數(shù)的表示方法有關,IEEE 754

論壇徽章:
0
5 [報告]
發(fā)表于 2014-11-29 17:17 |只看該作者
本帖最后由 c04n05 于 2014-11-29 17:37 編輯

回復 4# hellioncu
回復 2# xphh2008
感謝關注。

經(jīng)過驗證,用round可以,輸出改成這個樣子

printf("%.2f * %d =  %d\n", test, i, (int)(round(test * i)));

但是在linux下這個函數(shù)需要c99標準,編譯命令如下

gcc -o floattest floattest.c -std=c99 -lm

我們平臺以前沒有用到這個。不知道是否會影響其他代碼?

ps:
又試了一下,去掉-std=c99結果一樣。不過編譯會有警告


   

論壇徽章:
0
6 [報告]
發(fā)表于 2014-11-29 17:52 |只看該作者
c04n05 發(fā)表于 2014-11-29 17:17
回復 4# hellioncu
回復 2# xphh2008
感謝關注。


不是一定要用round函數(shù)的啦,四舍五入很簡單的,我們一般這么做:

(int)(x + 0.5)

然后寫個ROUND宏就行了~



論壇徽章:
0
7 [報告]
發(fā)表于 2014-11-29 17:59 |只看該作者
回復 6# xphh2008
哦。這個思路也很不錯!
果然來壇子里問一下是正確的

   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP