[問題] printf("%x%x", 0.1);
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux / FreeBSD
(64bit) (32bit)
問題(Question):
剛剛上計概課時,老師提到了浮點數的內部二進位表達方式
並舉了下面這個例子
http://i.imgur.com/2zL8T.png

我當下非常好奇用 %x%x 印出 0.1 的結果
直接用筆電寫出下面的測試程式
// gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
#include <stdio.h>
int main(){
printf("%x%x\n", 0.1);
return 0;
}
gcc vet.c
印出了奇怪的結果
./a.out
300eab68300eab78
超神奇的
多完個幾次之後發現見鬼了
怎麼每次 compile 出來都不一樣 = =
http://i.imgur.com/SkUlc.png

我去問教授,教授思考了很久
表示:『compiler 的問題,你回去用 VC++ 試試』
=========================
我回寢室後用我工作站的機器寫了一樣的 code
// gcc version 4.2.1 20070719 [FreeBSD]
10:43pm xatier@sa [~] [W2] >vim foo.c
10:43pm xatier@sa [~] [W2] >gcc foo.c
10:43pm xatier@sa [~] [W2] >./a.out
9999999a3fb99999
10:43pm xatier@sa [~] [W2] >gcc foo.c
10:43pm xatier@sa [~] [W2] >./a.out
9999999a3fb99999
10:43pm xatier@sa [~] [W2] >gcc foo.c
10:43pm xatier@sa [~] [W2] >./a.out
9999999a3fb99999
沒噴警告也沒發生問題阿?
求觀念導正 Orz
補充說明(Supplement):
另外想知道 printf() 內部到底是怎麼做的?
老師說 printf() 會把後面全部的 args 吃進去放到某個空間
然後依照你給的 formatted string 按照每一種 data type 去切割資料
假如是 int 就挖出 4 byte 出來這樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.24.36
→
11/10 22:59, , 1F
11/10 22:59, 1F
推
11/10 23:02, , 2F
11/10 23:02, 2F
→
11/10 23:03, , 3F
11/10 23:03, 3F
→
11/10 23:09, , 4F
11/10 23:09, 4F
→
11/10 23:10, , 5F
11/10 23:10, 5F
→
11/10 23:12, , 6F
11/10 23:12, 6F
→
11/10 23:12, , 7F
11/10 23:12, 7F
→
11/10 23:14, , 8F
11/10 23:14, 8F
看不懂 asm 於是我又做了另一個實驗
把他改成下列這樣
printf("%x %x %x %x %x %x %x %x\n", 0.1);
bf260d88 bf260d98 400520 4005b0 e7858f10 0 e74cc30d 0
ba937a98 ba937aa8 400520 4005b0 6a066f10 0 69cda30d 0
2fe07f58 2fe07f68 400520 4005b0 b8727f10 0 b839b30d 0
320babe8 320babf8 400520 4005b0 632d3f10 0 62f4730d 0
中間這幾位神奇的一樣了 \("▔□▔)/
※ 編輯: xatier 來自: 140.113.24.36 (11/10 23:21)
推
11/10 23:21, , 9F
11/10 23:21, 9F
→
11/10 23:21, , 10F
11/10 23:21, 10F
→
11/10 23:22, , 11F
11/10 23:22, 11F
→
11/10 23:27, , 12F
11/10 23:27, 12F
→
11/11 00:11, , 13F
11/11 00:11, 13F
→
11/11 00:13, , 14F
11/11 00:13, 14F
→
11/11 00:13, , 15F
11/11 00:13, 15F
→
11/11 00:13, , 16F
11/11 00:13, 16F
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 1 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章