C_and_CPP 板


LINE

原問題是,在不調用 math.h 下,如何判斷一個浮點數是不是整數? 類似的問題還有 ceil、floor、rounding ( return (int)(x+0.5); ) 以 ceil 為例,考慮正負號、完善些的的可能長得像這樣 double ceil(double x) { if( x==(int)x) return (int)x; else if(x > 0.0) return (int)(x+1); else return (int)(x); } 而在不調用 math.h 下,判斷一個浮點數是否為整數,寫起來可能像這樣 int IsInteger(double x) { return (int)(x)==x; } 上面這些是在看 blog 時,大多人面試給的答案,但我認為不算正確 ( 當然我不是面試官,我不知道他們是怎麼評量這些答案的 ) 用 cast 達到 ceil、floor、rounding、判斷整數還蠻常見的, 但我認為錯誤的關鍵是在於這種寫法完全乎視了 casting 所帶來之影響, 換句話說,上述任一函式,將 x 以 12345678901234567890.12 傳入, 這在 casting 時必會發生 error,造成不可預期之錯誤。 問題來了,我也不知道真正標準的,「判斷整數」、「模擬 ceil」,該如何做, 初步是有想過以 IEEE754 64bits 方式下去分析,但卻又一直想不透, 不知各位版友對於此問是否有其他想法? 謝謝各位不吝解惑。 -- YouLoveMe() ? LetItBe() : LetMeFree(); --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41 tropical72:轉錄至看板 Programming 09/28 00:00
1F:推 VictorTom:一定要回避cast可能造成的問題的話, 小弟我想到的方式也 09/28 00:03
2F:→ VictorTom:是直接抓IEEE754的浮點表示法, 解出exponent與mentisa出 09/28 00:03
3F:→ VictorTom:來算, 理論上可以藉由bit expression找到一個rule來判斷 09/28 00:04
4F:→ VictorTom:一個浮點數是否為整數; 限定用754表示法儲存的數就是了. 09/28 00:04
5F:推 alongalone:不用library, 那你從資料結構下手吧....自己把double 09/28 00:04
6F:→ alongalone:從新組合成integer 的格式 09/28 00:05
VictorTom 與 alongalone 所提之方式與小弟想到的有同曲之妙, 唯目前即使以 unsigned long long * 去接出來,還是讓人感到難以著手。 ( 在想這應也是一小段演算法了吧 ? ) 想過方式為,先取得 B=2^(exp-basement),假設 matissa = 111101... 再以 (1+0.5) * B, (1+0.75) * B, (1 + 0.875) *B, 再去判斷最大可能之整數, 問題又落回去了, 「判斷浮點數為整數」。 ※ 編輯: tropical72 來自: 180.177.78.41 (09/28 00:10)
7F:推 ericinttu:好久好久沒看到這個浮點表示法了ORZ 發言之前先複習一下 09/28 00:12
8F:推 VictorTom:小弟以為, 計算exponent的值, 是否足以讓mentisa shift 09/28 00:16
9F:→ VictorTom:到成為1.xxxxxxxx(x為0or1)的正規表示式後, 小數點.之後 09/28 00:17
10F:→ VictorTom:全為0, 是的話即代表該數為整數(先不考慮超小數)@_@" 09/28 00:17
11F:→ VictorTom:所以應該不用去算出浮點數來, 計算bit位數應該就行了@@" 09/28 00:18
12F:推 ericinttu:跟VictorTom想法一致 09/28 00:20
13F:推 ericinttu:http://www.h-schmidt.net/FloatApplet/IEEE754.html 09/28 00:25
14F:→ ericinttu:mentias 有幾個bits, 最多就是需要左shift幾次. 09/28 00:26
15F:→ tropical72:真的是晃然大悟!這樣 ceil/floor 也可類似搞出來了. 09/28 00:27
16F:→ tropical72:感謝各位. 09/28 00:27
17F:推 ericinttu:用簡單的說法(假如有講錯請鞭) 09/28 00:29
18F:→ ericinttu:IEEE754 是 1+8+23 bits. mentisa 用到左邊數來第幾位, 09/28 00:31
19F:→ ericinttu:它的exponent值就要有多少. 09/28 00:32
20F:→ ericinttu:有一些特例/邊界值, 可能要另外考慮 (還沒有檢查那些) 09/28 00:33
21F:→ tropical72:嗯,這樣效率變 find most right bit 問題,可解.感謝!! 09/28 00:37
22F:推 ericinttu:特例情況是指 http://zh.wikipedia.org/wiki/IEEE_754 09/28 00:56
23F:→ ericinttu:32位單精度之下, 零/負零/... 等等的情況都要考慮到. 09/28 00:57
24F:推 cutecpu:http://codepad.org/L5qDMZdg 09/28 01:16
25F:→ tropical72:謝謝 cutecpu, 補上union http://codepad.org/Sixd4u0n 09/28 01:38
26F:→ firejox:請愛用sprintf~~ 09/28 01:52
27F:→ tropical72:sprintf ? 字串分析嗎? 09/28 01:53
28F:→ tropical72:sprintf(buf, "%.16e", x); 再分析 buf 嗎?不就慢了? 09/28 01:54
29F:→ firejox:恩恩 是的 09/28 01:54
30F:→ tropical72:sprintf 確實也為一種解法便是, 謝謝 firejox 提供 ^^ 09/28 01:55
31F:→ firejox:可是能夠完善處理總比出錯好呀~~ 09/28 01:56
32F:→ tropical72:確實可能較完善,只是在面試這回答恐怕.. 09/28 02:09
※ 編輯: tropical72 來自: 180.177.78.41 (09/28 02:09)
33F:→ littleshan:sprintf要小心buffer overflow唷 09/28 02:48







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP