全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1559
推到 Plurk!
推到 Facebook!

無條件捨去的問題?

尚未結案
rangen6912
一般會員


發表:11
回覆:5
積分:3
註冊:2004-04-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-22 10:03:25 IP:61.61.xxx.xxx 未訂閱
float fri_Vp; int m=int (fri_Vp 0.00001); epsilon=fri_Vp-m; 小弟正在寫一無條件捨去的程式, 可是很奇怪的事發生了,若fri_Vp 數值為整數時,m計算出來的值會比 當時的fri_Vp少1,請教各位大大, 這是怎麼一回事?還有我該怎麼去修 改我的程式?
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-22 10:31:31 IP:140.126.xxx.xxx 未訂閱
奇怪,我不會有問題,會不會是你輸入fri_Vp數值出錯了
rangen6912
一般會員


發表:11
回覆:5
積分:3
註冊:2004-04-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-22 10:51:21 IP:61.61.xxx.xxx 未訂閱
說也奇怪,我自己也有點不太相信, 可是真的發生,當fri_Vp=20時,m=19???
unsigned
一般會員


發表:0
回覆:1
積分:0
註冊:2003-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-24 12:15:25 IP:218.81.xxx.xxx 未訂閱
#include 
#include <math.h>    double Round(const double Value,
             /*保留到小數點後第ADigit位*/
             const short int ADigit,
             /*RoundMark為保留方式,默認值應當為0,即執行常規的四舍五入*/
             /*-1表示取不大於當前數的帶ADigit位小數的最大數值,即無條件舍去*/
             /* 1表示取不小於當前數的帶ADigit位小數的最大數值,即無條件收上*/
             const short int RoundMark
            )
{
   char LocalRoundMark=RoundMark;
   double Result=Value;
   double DResult;
   double DigitValue;       if(ADigit>18||ADigit<-18)/*由於pow函數的限制,ADigit不能超過±18*/
      return Result;       DigitValue=pow(10,ADigit);/*取10的ADigit次方*/       /*LocalRoundMark只有三種狀態值,等於0,小於0*/
   if(LocalRoundMark>0)
      LocalRoundMark=1;
   if(LocalRoundMark<0)
      LocalRoundMark=-1;       switch(LocalRoundMark)
   {
      case -1:/*取不大於當前Value的帶ADigit位小數的最大數值*/
           Result*=DigitValue;           
           Result=(Value<0.0)?ceil(Result):floor(Result);
           break;          case  1:/*取不小於當前Value的帶ADigit位小數的最大數值*/
           Result*=DigitValue;           
           Result=(Value<0.0)?floor(Result):ceil(Result);
           break;                        default:/*四舍五入*/
           if(Value<0.0)
              Result-=0.5/DigitValue;
           else
              Result =0.5/DigitValue;
           
           Result*=DigitValue;
           DResult=Result;               if(Value<0.0)
           {
              Result=ceil(Result);
              DResult=Result-DResult;
              /*此處為浮點誤差值,理論值為1*/
              /*但是實際可能達不到1,而用ceil後會由此產生誤差值*/
              /*而後就需要做調整*/
              if(DResult>0.99999995)
                 Result-=1.0;
           }
           else
           {
              Result=floor(Result);
              DResult-=Result;
              /*此處為浮點誤差值,理論值為1*/
              /*但是實際可能達不到1,而用foor後會由此產生誤差值*/
              /*而後就需要做調整*/
              if(DResult>0.99999995)
                 Result =1.0;
           }
   }
   Result/=DigitValue;
   return Result;
}
發表人 - unsigned 於 2005/08/24 12:25:21
系統時間:2024-05-12 3:10:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!