青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++之竹

無論是太陽下,還是風(fēng)雨中,都要成長!

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

關(guān)于數(shù)值的整數(shù)次方的計(jì)算

在計(jì)算一個(gè)浮點(diǎn)數(shù)(雙精度或單精度)的整數(shù)次方時(shí),一般的,我們會(huì)直接使用 C++ 本身所提供的 pow 函數(shù),事實(shí)上也推薦直接使用 pow 函數(shù)(為了稱呼簡便,后面稱該 pow 函數(shù)為系統(tǒng) pow 函數(shù))。

但是,當(dāng)我們準(zhǔn)備寫一個(gè)自己的 pow 時(shí),我們又會(huì)怎么寫呢?一般的,我們會(huì)寫上一個(gè) for 循環(huán)來循環(huán)冪的指數(shù)次,而且每次循環(huán)都會(huì)去執(zhí)行一次浮點(diǎn)數(shù)的乘法操作。但是,當(dāng)我們拿這個(gè) pow 函數(shù)來跟系統(tǒng) pow 函數(shù)作一運(yùn)行比較時(shí),就會(huì)發(fā)現(xiàn),我們的 pow 實(shí)在是太低效了。那么怎么樣才能使我們自己寫的 pow 也能有系統(tǒng)函數(shù)那樣的時(shí)間效率呢?

仔細(xì)分析,我們用的那個(gè)求冪值的循環(huán)過程,就能發(fā)現(xiàn),其實(shí)我們還是做了很多不必要的浮點(diǎn)數(shù)乘法炒作。整個(gè)計(jì)算過程太過按步就班了。譬如說在計(jì)算 val(待傳入pow 函數(shù)求冪的浮點(diǎn)數(shù),下同) 的4次方,我們總是先計(jì)算出3次方的值,然后再根據(jù)3次方的值和原始值來求4次方的值;然而,我們其實(shí)本可以在計(jì)算出2次方值后,平方2次方值來得到4次方的值的。接下來,就是探索算法,以減少浮點(diǎn)數(shù)乘法的事了。

通過所學(xué)的指數(shù)函數(shù)的知識(shí),我們知道指數(shù)函數(shù)有著這樣的性質(zhì):

  • V(a+b) = Va * Vb
  • Va*b = (Va)b             ;這里 * 為乘法運(yùn)算符

另外,對(duì)于整數(shù),有如下性質(zhì):

  1.  2n = (1 << n)         ;這里 << 是向左移位的操作符。
  2. C++中的任何一個(gè)正整數(shù)(負(fù)整數(shù)同,但須處理好符合位)都可以表示為以下形式:
    n = 2a1 + 2a2 + ... + 2ak
    (其中,a1, a2, ... , ak 為閉區(qū)間 [0, 30] 上的整數(shù)值,且互不相同。)

由此,我們就可以事先依次計(jì)算出 val, val2, val4, ... , val30 預(yù)存?zhèn)溆茫缓笤俑鶕?jù) val 相應(yīng) bit 上是 1 還是 0,來選取相應(yīng)的預(yù)存數(shù)據(jù)進(jìn)行相乘,從而得到最終的結(jié)果。當(dāng)然,合理設(shè)計(jì)邏輯,還可以減少所需的預(yù)存數(shù)據(jù)。下面是我的Pow 代碼,歡迎點(diǎn)評(píng)。

 

#define INTBITS_WITHOUT_SIGN 31 // the bit-size of type int with the sign bit being excluded.


bool IsZero(double val, double precision /*= DEFAULT_PRECISION*/)
{
    
if (precision >= 0{
        
return (-precision <= val) && (val <= precision);
    }
 else {
        
return (precision <= val) && (val <= -precision);
    }

}


double Pow(double val, int exponent)
{
    
if (IsZero(val)) {
        
return 0.0;
    }


    
if (0 == exponent) {
        
return 1.0;
    }


    
bool bIsExponentMinus = false;
    
if (exponent < 0{
        exponent 
= -exponent;
        bIsExponentMinus 
= true;
    }


    
double tempVal[INTBITS_WITHOUT_SIGN];
    memset(tempVal, 
0, INTBITS_WITHOUT_SIGN);
    tempVal[
0= val;

    
double result = 1.0;
    
int index = 0;
    
while (exponent != 0{
        
if ((exponent & 1!= 0{
            result 
*= tempVal[index];
        }


        exponent 
>>= 1;
        
if (exponent != 0{
            tempVal[index 
+ 1= tempVal[index] * tempVal[index];
            
++index;
        }

    }


    
if (bIsExponentMinus) {
        result 
= 1.0 / result;
    }


    
return result;
}

 
【補(bǔ)充】:

1. 在指數(shù)中,0的負(fù)數(shù)次方和0的0次方,都是沒有意義的,所以對(duì)“if (IsZero(val))”分支內(nèi)的處理如果能加上一些異常的輸出就更好了,如:

   在Widows下,可通過 SetLastError(...) 來設(shè)置錯(cuò)誤碼。

2. Pow中的 “double tempVal[INTBITS_WITHOUT_SIGN];” 一句,改寫為

   double * pTempVal = new double[sizeof(int) * 8 - 1];

(當(dāng)然,后面代碼中的tempVal 也都要改為相應(yīng)的 pTempVal,同時(shí)須記得在return 前把delete [] pTempVal)

就可以使代碼也能夠適應(yīng)于64位系統(tǒng)的處理。對(duì)于無符號(hào)整數(shù)的為指數(shù)的情況,則輔助值空間應(yīng)為“sizeof(unsigned int) * 8”,同時(shí),無需再考慮負(fù)指數(shù)的情況。

(這里,很感謝春秋十二月的補(bǔ)充。)
 

posted on 2012-03-17 04:01 青碧竹 閱讀(3034) 評(píng)論(4)  編輯 收藏 引用 所屬分類: 算法相關(guān)

評(píng)論

# re: 關(guān)于數(shù)值的整數(shù)次方的計(jì)算 2012-03-17 09:26 tb

算法不錯(cuò)  回復(fù)  更多評(píng)論   

# re: 關(guān)于數(shù)值的整數(shù)次方的計(jì)算 2012-03-17 11:12 zdhsoft

好像浮點(diǎn)數(shù)有這樣的匯編指令!  回復(fù)  更多評(píng)論   

# re: 關(guān)于數(shù)值的整數(shù)次方的計(jì)算 2012-03-17 13:27 春秋十二月

樓主算法不錯(cuò),補(bǔ)充說明幾個(gè)小問題:
(1)C++中的任何一個(gè)正整數(shù)(負(fù)整數(shù)同,但須處理好符合位)都可以表示為以下形式:n = 2^a1 + 2^a2 + ... + 2^ak
(其中,a1, a2, ... , ak 為閉區(qū)間 [0, 30] 上的整數(shù)值,且互不相同。)
正確描述應(yīng)該是:n = k1*2^a1+k2*2^a2+...+kn*2^ak,k(i)=0或1。你這里取值為30,針對(duì)的是有符號(hào)4個(gè)字節(jié)大小的整數(shù)。
(2)依(1)所述,如果是無符號(hào)整數(shù)或8個(gè)字節(jié)大小的整數(shù),就不是30了,為完備靈活起見,Pow函數(shù)內(nèi)部輔助空間大小應(yīng)依據(jù)int或unsigned int的大小來編譯時(shí)決定。
  回復(fù)  更多評(píng)論   

# re: 關(guān)于數(shù)值的整數(shù)次方的計(jì)算 2012-03-18 23:31 青碧竹

@春秋十二月
多謝兄弟的補(bǔ)充!在寫這篇博文時(shí),確實(shí)是只針對(duì)了32位的int。

對(duì)于補(bǔ)充(1):其實(shí) 32位int的完整表示為
((-1)^<符號(hào)位數(shù)值>) * (k0*2^0+k1*2^1+...+k30*2^30)
ki ∈{0,1}, i ∈{0, 1, ... , 30}
而在我文中,是略去 符號(hào)位 和 ki=0 的項(xiàng)后的表示形式。

對(duì)于補(bǔ)充(2):64位系統(tǒng)日益普遍的現(xiàn)在,確實(shí)應(yīng)該考慮64為整數(shù)的情況。這點(diǎn)我疏忽了。
  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品自在在线| 亚洲一区免费| 欧美一区二区三区视频在线观看| 亚洲另类视频| 91久久在线播放| 亚洲人成啪啪网站| 亚洲三级电影全部在线观看高清 | 美女日韩欧美| 噜噜噜噜噜久久久久久91| 久久夜色精品国产欧美乱极品| 麻豆国产精品va在线观看不卡| 欧美激情一区二区三级高清视频| 亚洲黄色有码视频| 99综合精品| 欧美一区二区黄色| 美日韩精品视频| 欧美少妇一区| 有坂深雪在线一区| 亚洲视频精选| 久久婷婷一区| 99国产精品久久久久久久成人热 | 免费成人你懂的| 欧美亚洲不卡| 亚洲盗摄视频| 欧美一区二区三区在线观看| 男人的天堂亚洲| 亚洲一二三级电影| 欧美激情在线有限公司| 国产午夜亚洲精品不卡| 99精品视频网| 玖玖综合伊人| 亚洲一区二区视频在线观看| 免费久久久一本精品久久区| 国产亚洲精品7777| 亚洲视频在线观看视频| 女人色偷偷aa久久天堂| 新片速递亚洲合集欧美合集| 欧美视频中文字幕在线| 日韩亚洲欧美一区| 欧美国产精品劲爆| 久久久久国产一区二区| 国产精品伊人日日| 亚洲一区在线播放| 亚洲裸体视频| 欧美日韩国内| 中文国产成人精品| 夜夜嗨av一区二区三区四区| 欧美精品一卡| 一本大道久久a久久精二百| 欧美成人午夜剧场免费观看| 午夜精品剧场| 国产午夜精品美女毛片视频| 欧美一区二区三区免费观看 | 久久久久综合网| 国产一区二区三区的电影 | 国内精品**久久毛片app| 亚洲在线观看免费| 99精品99| 国产精品久久看| 亚洲欧美不卡| 欧美一区二区高清| 99热精品在线| 国产精品视频免费观看www| 亚洲午夜精品| 一区二区三区视频在线观看| 欧美日韩ab片| 亚洲天堂黄色| 午夜视频一区在线观看| 国产偷自视频区视频一区二区| 亚洲字幕一区二区| 亚洲欧美精品| 黄色一区三区| 亚洲第一毛片| 欧美日韩免费视频| 亚洲自拍另类| 欧美在线免费观看| 亚洲黄网站在线观看| 亚洲欧洲午夜| 欧美日韩一区二区在线观看视频| 亚洲一区二区三区中文字幕在线| 这里是久久伊人| 狠狠狠色丁香婷婷综合久久五月| 欧美va天堂| 欧美日韩一区二区三区在线视频| 亚洲制服av| 久久精品人人爽| 亚洲美女视频在线观看| 亚洲欧美日韩一区二区三区在线| 一区二区视频免费在线观看| 亚洲国产精品一区| 国产精品看片资源| 欧美成人免费网| 国产精品免费在线 | 亚洲国语精品自产拍在线观看| 欧美日韩999| 久久综合久久综合这里只有精品| 欧美国产视频在线观看| 午夜电影亚洲| 欧美高清视频在线播放| 久久国产精彩视频| 欧美人牲a欧美精品| 久久这里只精品最新地址| 欧美另类极品videosbest最新版本| 欧美一区=区| 欧美搞黄网站| 老**午夜毛片一区二区三区| 国产精品v一区二区三区| 欧美国产高清| 极品少妇一区二区三区| 亚洲无线一线二线三线区别av| 亚洲人成人一区二区在线观看| 欧美一区综合| 午夜亚洲伦理| 国产精品www| 99国产精品久久久| 一区二区三区 在线观看视| 美女网站在线免费欧美精品| 久久夜色精品国产欧美乱极品| 国产精品久久久久久亚洲毛片 | 欧美一区二区高清| 欧美日韩视频一区二区三区| 欧美高清视频免费观看| 久久国产手机看片| 亚洲欧美不卡| 欧美视频1区| 一区二区电影免费观看| 亚洲三级免费电影| 免费不卡在线观看| 欧美电影在线| 91久久久精品| 欧美激情第9页| 91久久精品国产91久久| 91久久国产综合久久| 免费日韩视频| 亚洲国产欧美一区二区三区久久 | 欧美在线关看| 久久久久国产精品午夜一区| 国产欧美日韩专区发布| 午夜精品久久久久久久| 久久国产精品亚洲77777| 国产午夜精品久久久久久久| 欧美在线亚洲| 欧美r片在线| 日韩亚洲在线观看| 欧美三区在线观看| 亚洲一区在线观看免费观看电影高清 | 一本色道久久综合狠狠躁篇的优点| 亚洲第一精品夜夜躁人人躁 | 国产一区二区欧美日韩| 久久精品二区三区| 蘑菇福利视频一区播放| 亚洲国产婷婷香蕉久久久久久99| 免费人成精品欧美精品| 亚洲人成亚洲人成在线观看图片 | 欧美一区二区三区久久精品| 久久精品一区四区| 亚洲高清资源| 欧美日韩亚洲一区二区三区在线| 亚洲天堂成人在线观看| 久久婷婷麻豆| 一区二区免费在线观看| 国产精品另类一区| 久久久久久久久久久久久女国产乱| 欧美搞黄网站| 欧美亚洲免费| 在线精品视频一区二区| 欧美激情一区二区在线| 亚洲欧美在线免费观看| 欧美大片一区二区| 亚洲欧美日本视频在线观看| 一区免费观看| 欧美午夜电影在线观看| 久久成人久久爱| 99视频超级精品| 欧美高清免费| 久久裸体视频| 亚洲欧美综合v| 亚洲韩国精品一区| 国产精品视频1区| 欧美国产精品va在线观看| 午夜精品视频在线观看一区二区| 亚洲国产成人91精品| 欧美一区二区黄| 一本色道久久综合精品竹菊| 国产一区清纯| 亚洲午夜高清视频| 亚洲承认在线| 久久久爽爽爽美女图片| 亚洲视屏一区| 亚洲精品国产精品国自产观看 | 欧美高清视频一区二区三区在线观看 | 亚洲香蕉在线观看| 亚洲第一搞黄网站| 国内精品国产成人| 国产精品毛片| 欧美日韩一区二区在线播放| 美日韩精品视频| 久久嫩草精品久久久精品一| 亚洲欧美日韩一区| 亚洲免费一区二区|