[問題] double印出的問題

看板C_and_CPP (C/C++)作者 (sunlights)時間13年前 (2013/01/18 13:33), 編輯推噓1(1037)
留言38則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev C++ 又是一個笨問題.. 我在測試的時候 printf("%f",123.4L); 結果竟然跑出一堆數字.. -18137553330312606000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000.000000 為什麼呢??改成printf("%lf",123.4L) 也是一樣...是寫法有問題嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.240.38.150 ※ 編輯: sunlights 來自: 111.240.38.150 (01/18 13:33)

01/18 13:39, , 1F
希望得到的結果?
01/18 13:39, 1F
我希望得到123.400000

01/18 13:41, , 2F
可以參考這篇 => http://tinyurl.com/asz7r5k
01/18 13:41, 2F
看起來好像window上的C compiler 對long沒支援.. 可是 long double n; scanf("%lf" , &n); printf("%lf\n" , n); 當我輸入123.4是可以正確印出123.400000 連結中的那一篇有寫不能支援80bit以上.. this library has no support for 80bits long double (microsoft C compiler use 64 bits long double for various reasons). 是否long double 使用80bit呢??(延伸雙精確度) 那long float 也是使用43bit(延伸單精確度)嗎?? 但很多教學文章裡都沒有提到long float應該是沒有這個型態.... ※ 編輯: sunlights 來自: 111.240.38.150 (01/18 14:16)

01/18 14:40, , 3F
long double 是 %llf
01/18 14:40, 3F

01/18 14:41, , 4F
然後沒有 long float,long double 幾 bits 是看 compiler
01/18 14:41, 4F

01/18 14:41, , 5F
實作給的,dev-c++(gcc) 給 80b, vc 給 64b.
01/18 14:41, 5F
如果dev-c++是80bit那就表示連結中的解釋不成立 那為什麼printf("%lf",123.4); 的時候不會正確顯示呢?? ※ 編輯: sunlights 來自: 111.241.53.151 (01/18 18:22)

01/18 18:44, , 6F
樓上: long double是%Lf
01/18 18:44, 6F

01/18 19:38, , 7F
抱歉,是%Lf 沒錯,%llf 是 vc 自己搞的,然後剛測了 dev-c++
01/18 19:38, 7F

01/18 19:38, , 8F
我的環境裡面 sizeof(long double)==12, 不是10.
01/18 19:38, 8F

01/18 19:43, , 9F
樓上: 事實上msvc還是%Lf http://goo.gl/diSP8
01/18 19:43, 9F

01/18 19:55, , 10F
!! 原來我誤用了那麼久... 謝謝 PkmX 指正 :)
01/18 19:55, 10F
那你們測printf("%lf",123.4); 的時候是多少呢?? ※ 編輯: sunlights 來自: 111.240.36.1 (01/18 21:09)

01/18 21:33, , 11F
01/18 21:33, 11F

01/18 21:33, , 12F
scanf 跟 printf 只要變數裝得下它就直接裝了
01/18 21:33, 12F

01/18 21:34, , 13F
就算宣告 long double 裡面裝的還是 double
01/18 21:34, 13F

01/20 00:56, , 14F
怎麼沒什麼人回答我的問題...printf("%lf",123.4);
01/20 00:56, 14F

01/20 00:56, , 15F
測起來是多少?
01/20 00:56, 15F

01/20 02:38, , 16F
施主... 為什麼你就不好好看內文 PkmX 大說的呢?
01/20 02:38, 16F

01/20 02:40, , 17F
%f 印精度小於(等於) double 的數值, %Lf 專印 long d
01/20 02:40, 17F

01/20 02:40, , 18F
哪來給你 %lf ... 一直誤用還需要測什麼
01/20 02:40, 18F

01/20 02:53, , 19F
scanf 之所以需要 %f %lf %Lf 來分別是因為型別不同
01/20 02:53, 19F

01/20 02:55, , 20F
所以需要足夠的記憶體來裝值(當然你解讀的時候也要正
01/20 02:55, 20F

01/20 02:56, , 21F
確), 但是 printf() 在雙精度以下都是用 double 先裝
01/20 02:56, 21F

01/20 02:57, , 22F
你給的變數數值再印出來, 所以兩個case用 %f 就作掉了
01/20 02:57, 22F

01/20 03:06, , 23F
你編輯的內文中那個case很可能因為long double其實是
01/20 03:06, 23F

01/20 03:07, , 24F
double的alias所以才會剛好讀入正確的數值, 不過至少
01/20 03:07, 24F

01/20 03:09, , 25F
還是要知道sizeof()值是否相同以及gcc有沒有做手腳才
01/20 03:09, 25F

01/20 03:09, , 26F
知道
01/20 03:09, 26F

01/20 03:26, , 27F
但是問題應該還是在 msvcrt.dll
01/20 03:26, 27F
好吧..我改成Lf long double n=123.4L; printf("%Lf",n); 結果一樣是-18137553330310773000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000 0000.000000為什麼?? ※ 編輯: sunlights 來自: 111.240.9.91 (01/20 18:47)

01/20 19:27, , 28F
因為 printf 底層的 library 遇到 Lf 也是用 64 bit 來算
01/20 19:27, 28F

01/20 22:17, , 29F
我想說dev-c++這種古董出任何問題都不意外...
01/20 22:17, 29F

01/20 22:19, , 30F
vc2010結果正常,可是vc的long double和double一樣
01/20 22:19, 30F

01/20 22:21, , 31F
01/20 22:21, 31F

01/20 22:27, , 32F
既然你這麼愛搞這種刁鑽的問題我強烈建議把devcpp換掉
01/20 22:27, 32F

01/20 22:27, , 33F
Code::Blocks或是VisualC++ Express都免錢
01/20 22:27, 33F

01/20 22:29, , 34F
樓上 a 大建議是對的 http://ppt.cc/8_vF 有爆卦
01/20 22:29, 34F

01/21 22:12, , 35F
原來是軟體的問題喔..我不是想問刁鑽的問題啦..因為我
01/21 22:12, 35F

01/21 22:13, , 36F
有想要去考試..所以怕這題出出來..結果答案怎麼有出入..
01/21 22:13, 36F

01/21 22:14, , 37F
反正就不要用dev-c就對了
01/21 22:14, 37F

01/21 22:15, , 38F
還蠻好奇如果寫的程式在vc會過devc不過,會怎麼算分
01/21 22:15, 38F
文章代碼(AID): #1G-DwDKx (C_and_CPP)
文章代碼(AID): #1G-DwDKx (C_and_CPP)