[問題] no math.h, 如何判斷一浮點數 是否為整數
原問題是,在不調用 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
推
09/28 00:03, , 1F
09/28 00:03, 1F
→
09/28 00:03, , 2F
09/28 00:03, 2F
→
09/28 00:04, , 3F
09/28 00:04, 3F
→
09/28 00:04, , 4F
09/28 00:04, 4F
推
09/28 00:04, , 5F
09/28 00:04, 5F
→
09/28 00:05, , 6F
09/28 00:05, 6F
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)
推
09/28 00:12, , 7F
09/28 00:12, 7F
推
09/28 00:16, , 8F
09/28 00:16, 8F
→
09/28 00:17, , 9F
09/28 00:17, 9F
→
09/28 00:17, , 10F
09/28 00:17, 10F
→
09/28 00:18, , 11F
09/28 00:18, 11F
推
09/28 00:20, , 12F
09/28 00:20, 12F
推
09/28 00:25, , 13F
09/28 00:25, 13F
→
09/28 00:26, , 14F
09/28 00:26, 14F
→
09/28 00:27, , 15F
09/28 00:27, 15F
→
09/28 00:27, , 16F
09/28 00:27, 16F
推
09/28 00:29, , 17F
09/28 00:29, 17F
→
09/28 00:31, , 18F
09/28 00:31, 18F
→
09/28 00:32, , 19F
09/28 00:32, 19F
→
09/28 00:33, , 20F
09/28 00:33, 20F
→
09/28 00:37, , 21F
09/28 00:37, 21F
推
09/28 00:56, , 22F
09/28 00:56, 22F
→
09/28 00:57, , 23F
09/28 00:57, 23F
推
09/28 01:16, , 24F
09/28 01:16, 24F
→
09/28 01:38, , 25F
09/28 01:38, 25F
→
09/28 01:52, , 26F
09/28 01:52, 26F
→
09/28 01:53, , 27F
09/28 01:53, 27F
→
09/28 01:54, , 28F
09/28 01:54, 28F
→
09/28 01:54, , 29F
09/28 01:54, 29F
→
09/28 01:55, , 30F
09/28 01:55, 30F
→
09/28 01:56, , 31F
09/28 01:56, 31F
→
09/28 02:09, , 32F
09/28 02:09, 32F
※ 編輯: tropical72 來自: 180.177.78.41 (09/28 02:09)
→
09/28 02:48, , 33F
09/28 02:48, 33F
討論串 (同標題文章)