Re: [問題] no math.h, 如何判斷一浮點數 是否為整數
※ [本文轉錄自 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
Programming 近期熱門文章
PTT數位生活區 即時熱門文章