kowala's home

kowala's home
這裡是我的學習筆記,陸續增加中。
http://kowala21.blogspot.com

2011-06-14

Android 含極值的四捨五入計算

Android 含極值的四捨五入計算

    /**
     * double 極值的定義
     */
    double inf=1.0/0.0;//正無限大
    double neginf=-1.0/0.0;//負無限大
    double negzero=-1.0/inf;//負0
    double NaN=0.0/0.0;//Not A Number

    /**
     * 含極值的四捨五入處理
     * @param v 需要四捨五入的數位
     * @param scale 小數點後保留幾位
     * @return 四捨五入後的結果
     */
    public double round(double v,int scale){        
        if(v==Double.POSITIVE_INFINITY)return inf;
        if(v==Double.NEGATIVE_INFINITY)return neginf;
        if(v==negzero)return negzero;
        if(Double.isNaN(v))return NaN;
        BigDecimal bd = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        if(scale<0)scale=0;//小數位數>=0
        return bd.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

使用說明
在數學計算中,常常會用到四捨五入,例如求 Sin(x),求到小數6位,
但若是要求CSC(x)時,那可能就要面對分母為0的問題了,其實分母不是0
而是趨近於0,這就是極值問題。
BigDecimal 可以處裡極大值及+0 及-0值,但若是 NaN則會傳回錯誤,所以要檢查NaN
並直接傳回NaN。

註:NaN (Not A Number)


有關三角函數極值

sin(+0.0) = +0.0 
sin(-0.0) = -0.0 
sin(+infinity) = NaN 
sin(-infinity) = NaN 
sin(NaN) = NaN 

cos(+infinity) = NaN 
cos(-infinity) = NaN 
cos(NaN) = NaN 

tan(+0.0) = +0.0 
tan(-0.0) = -0.0 
tan(+infinity) = NaN 
tan(-infinity) = NaN 
tan(NaN) = NaN 

參考文件
Java Floating-Point Number Intricacies

沒有留言:

張貼留言

請提供您的寶貴意見 ;-)