1. 程式人生 > >[演算法筆記]——位運算平方根

[演算法筆記]——位運算平方根

(感謝知乎大神的解惑)
上一篇部落格引了一個有趣的位運算演算法,可以通過位運算大致算出一個浮點數的平方根,雖然查找了相關資料,但是還是對原理有些困惑。
下面是程式碼:

float sqrt3(const float x)
    {
        union
        {
            int i;
            float x;
        } u;

        u.x = x;
        u.i = (1 << 29) + (u.i >> 1) - (1 << 22);
        return u.x;
    }

這個方法的誤差還是有的(而且有點大)

首先,C中union 的儲存方法與struct不同,union只儲存一個成員變數,union的儲存大小為位元組對齊後所需空間最“大”的成員。

這個函式中的i(int),x(float)共用一個32位儲存空間
一個浮點數由兩部分組成:底數M和指數E,底數部分佔用23bit使用二進位制數來表示浮點數的實際值;指數部分佔用8bit,第一位來表示正負,所以指數部分範圍為(-126~128)
再通過指數部分的值來調整底數部分的值,如果指數為負,則左移,反而反之

所以一個浮點數可以表示為
x=(-1)^s * (2^E) * M
這個演算法的思想就是將E縮小為原來的一半,所以結果就是開方
(指數部分必須減去127才是真正的指數)

所以讓新的e為當前e的一半,可以列下列方程
2(x - 127) = (x` - 127)

解得x = x`/2 + 63

至此,發現原演算法中u.i>>1可以實現/2,(1<<29) - (1<<22) 為63
u.i>>1不僅把指數也右移了,也把尾數右移了,所以導致結果只是一個近似值

相關推薦

[演算法筆記]——運算平方根

(感謝知乎大神的解惑) 上一篇部落格引了一個有趣的位運算演算法,可以通過位運算大致算出一個浮點數的平方根,雖然查找了相關資料,但是還是對原理有些困惑。 下面是程式碼: float sqrt3(const float x) { uni

整理筆記--運算

... too log 置0 計算 post turn color 最小值 1.獲取int型最大值: int getMaxInt(){ return (1 << 31) - 1;//2147483647, 由於優先級關系,括號不可省略

[學習筆記]運算

計算機為什麼用二進位制? 因為二進位制簡單。每個位置只有0/1兩種情況。 並且任何數都可以表示成二進位制。 0/1代表開/關,選/不選都有優勢。   例題: 1. Single Number■ 有一個數組,裡面的元素每個都出現了兩次,除了一個特殊的,求這個特殊元素。 直接異或 Si

演算法運算技巧

對於仍然不太清楚位操作符的同學們,可以看看這篇文章:[位操作符](https://www.cnblogs.com/blknemo/p/14141417.html) # 特別注意 > **特別注意:**使用按位操作符時要注意,相等(==)與不相等(!=)的優先順序在按位運算子之上!!!! 這意味著,位運算子的

演算法筆記 — 進制轉換(大數運算-十進位制轉二進位制)

  題目連結:http://www.codeup.cn/problem.php?cid=100000579&pid=2 題目描述 將一個長度最多為30位數字的十進位制非負整數轉換為二進位制數輸出。 輸入 多組資料,每行為一個長度不超過30位的十進位制非負整數

演算法競賽進階指南」 0x01 運算 知識筆記

二進位制是計算機的根本! 你瞭解她它嗎? int lowbit(int x) { return x&(-x);//x&(~x+1),~x=-1-x; } int __builtin_ctz(unsigned int x) int __builtin_ctzll(unsigned l

Java學習筆記——關於運算符的問題

java學習筆記 strong ont com post 技術 學習筆記 直接 inf 我就之直接貼圖了!不想排版了! 有什麽問題,歡迎大家指出,幫助我提高,謝謝!Java學習筆記——關於位運算符的問題

Python筆記_第一篇_童子功_0.內存詳解(含運算)

臨時 解決 har 內存鏈 計算器 它的 影響 con 封裝   Python的很多教材中並沒有講內存方面的知識,但是內存的知識非常重要,對於計算機工作原理和方便理解編程語言是非常重要的,尤其是小白,因此需要把這一方面加上,能夠更加深入的理解編程語言。這裏引用了C語言關於內

Python筆記_第一篇_童子功_3.進制和運算

我們 方式 三方 計算 相對 原理 進制 數據結構 什麽   通過對內存這一個部分的講解,對編程會有一個相對深入的認識。數據結構是整個內存的一個重要內容,那麽關於數據結構這方面的問題還需要對進制、位運算、編碼這三個方面再進行闡述一下。前面說將的數據結構是從邏輯上進行這方面

Java筆記運算

ring stat 意義 clas 提升 str pub style sys 一、數據存儲 二進制數在內存中以補碼的形式存放。正數的反碼、補碼均為本身。負數的反碼為符號位不變且其余位取反,補碼為反碼+1。 二、位運算 ①按位取反:反轉操作數中的所有位。 ②按位與:僅當兩

韓順平 java筆記 第20講 二進制 運算 移位運算

反碼 方式 body 符號位 blog amp 韓順平 移位 按位異或 1.對於有符號的而言   二進制的最高位是符號位,1表示整數 1表示負數   正數的源碼 反碼 補碼都一樣   負數的反碼 = 它的源碼符號位不變,其他位去反   負數的補碼 = 它的反碼+1   0

C語言學習筆記運算求余

nbsp 位運算 sdn 縮小 .net 一次 得出 ngs 有效 我們都知道,求一個數被另一個數整除的余數,可以用求余運算符”%“,但是,如果不允許使用求余運算符,又該怎麽辦呢?下面介紹一種方法,是通過位運算來求余,但是註意:該方法只對除數是2的N次方冪

Newcoder 39 F.重排的迴文串(莫隊演算法+運算

Description 給一個長為 n n n 的只含小寫字母的字串 每次查詢一個區間$ [l

資料結構與演算法-------斐波那契數列、運算、素數、最大公約數、最小公倍數

1、斐波那契數列 function fabeliq(n){ var arr=[]; if(n==1){ return arr=[0]; } if(n==2){ return arr=[0,1];

運算筆記

www. main targe log namespace span get 倒水 a* 一.基本概念&&操作 二.常用技巧 (1) 取最右邊的 1 ,適用範圍“lowbit” t=A&(-A) lo

@演算法 - [email protected] 運算卷積 —— FWT

目錄 @0 - 參考資料@ @1 - 異或卷積概念及性質@ @2 - 快速沃爾什正變換(異或)@ @3 - 快速沃爾什逆變換(異或)@ @4 - 與卷積、或卷積@ @5 - 參考程式碼實現@ @6 - 例題與應用@ @0 - 參考資料@ yyb 的講解 popoqq

【轉】字串匹配演算法(三)運算的魔法——KR與SO

位運算經常能做出一些不可思議的事情來,例如不用臨時變數要交換兩個數該怎麼做呢?一個沒接觸過這類問題的人打死他也想不出來。如果拿圍棋來做比喻,那麼位運算可以喻為程式設計中的“手筋”。 按位的儲存方式能提供最大的儲存空間利用率,而隨著空間被壓縮的同時,由於CPU硬體的直接支援,速度竟然神奇般

[轉載自知乎——有哪些令人拍案叫絕的演算法?] [侵必付] 關於運算

有一個n個元素的陣列,除了一個元素只出現一次外,其他元素都出現兩次,讓你找出這個只出現一次的元素是幾,要求時間複雜度為O(n)且不再開闢新的記憶體空間。 ——————————答案分割線————————— 解法是將所有元素做異或運算,即a[1] XOR a[2] XOR a[3] XOR…XOR a[n],所

C語言學習筆記11--運算

位運算概念 位運算是指按二進位制位進行的運算。因為在系統軟體中,常要處理二進位制位的問題。 例如:將一個儲存單元中的各二進位制位左移或右移一位,兩個數按位相加等。 c語言提供位運算的功能,與其他高階語言(如PASCAL)相比,具有很大的優越性。 位運算子和位運算 位運算子

演算法】位元計算(A+B Problem)-運算子介紹、運算實現加減乘除

問題描述 問題:計算A+B,不適用“+”運算子(LintCode 1.A + B Problem) 注意:A B均為32位整數,可使用位元位計算 解決思路 演算法示例 程式碼如下:(通過LintCode測試) class Solution