Re: [問題] no math.h, 如何判斷一浮點數 是否為整數

看板Programming作者 (喵喵叫的蜜蜂貓)時間14年前 (2011/09/28 02:35), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 C_and_CPP 看板 #1EWXTIHA ] 作者: SmallBeeWayn (喵喵叫的蜜蜂貓) 看板: C_and_CPP 標題: Re: [問題] no math.h, 如何判斷一浮點數 是否為整數 時間: Wed Sep 28 02:34:55 2011 註:我C不強,以下是用直接語意混合VB.2010寫法 C語言版那邊似乎也有一些討論了 以原PO提到的大數字(超過Integer精度)問題 一解是直接去解析結構,另外一解就是轉文字處理 Function IsInt(ByVal X As Double) As Boolean Dim S As String = X.ToString If S包含文字"." Then If S包含文字"e" Then Dim Y() As String = 分離S藉由"e" Return (Y(0)部分最小位數不包含小數) Else Return False Else Return True End Function ============================== 但是還有兩個問題 1.浮點數的儲存方式是以1/2,1/4,1/8這樣累加起來的 這造成不能正確表示所有的整數(尤其當數字很大時) 例如說某種浮點儲存表示法無法表示17只能表示成16.994140625 (14+1.75+0.875+0.21875+0.109375+0.02734375+0.013671875) (以14為基底,10bit長度) 當進行是否為整數判斷時,這會是一個問題 當然,現在的雙精度(64bit)浮點數不容易遇到這種問題,不過還是會發生 2.計算的累積誤差 浮點數經過一系列的加減乘除之後,由於其輸入精度有限,輸出精度也會產生累積誤差 以整數來說,如果我們硬要用整數去算0.7+0.5希望得到1 (0.7+0.5=1.2 四捨五入到1) 但實際上我們會得到2 (1+1=2, 因為兩數皆四捨五入),或是0 (兩數都直接捨去小數) 浮點數同樣有類似的問題 如果我們今天得到一個計算結果16.99999 而誤差為小數以下兩位,那這個結果為整數 如果誤差為小數六位,那這個結果就是浮點數了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.180.163 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.180.163
文章代碼(AID): #1EWXUCat (Programming)
文章代碼(AID): #1EWXUCat (Programming)