contributed by < Rsysz
>.
sysprog
將浮點數 orig
除以大於 0
的整數 slots
若 slots
為偶數
若 slots
為奇數,透過 result += divop(result, slots)
補償
對奇數 slots
加 1
後右移與補償,巧妙地加速計算速度,D1 = (c) 2
, D2 = (d) 1
首先看到 do while(0)
封裝的 marco
,這種用法是為了確保替換後程式正確編譯與減少內部 Bug
的發生,再來看到各 marco
的功能。
INSERT_WORDS
將 int ix0
轉為 float d
EXTRACT_WORDS
將 float d
轉為 int ix0
unsigned
與否,內部數值皆為相同的,因此皆以 int
表示接著看到整體程式碼,首先將 float x
轉為 int ix0
ix0 <= 0
也就是 float x
為負數時有兩個結果
(ix0 & (~sign)) == 0
表示除 sign
以外皆是 0
,代表 float x
為 +-0
開根號還是 0
,回傳 x
ix0 < 0
,表示 float x
為負浮點數,無法開根號,因此回傳 NaN
接著處理 INF
與 NaN
,先前條件不滿足且 (ix0 & 0x7f800000) == 0x7f800000
表示 float x
的 Exponent
部分皆為 1
+INF
表示為 fraction
皆為 0
NaN
表示為 fraction
部分皆可,此外先前 (ix0 < 0)
已排除 sign
為 1
的結果對浮點數做正規化,首先取出 ix0
的前九個bit 也就是 float x
的 sign
與 exponent
部分
m == 0
則對 ix0
做左移,直到 exponent
部分的 為 1
m
表示 exponent
部分,根據上圖對浮點數的正規化,m = m + 1 - i
接著將 m - 127
得到對應 exponent
的數字,並以 ix0 = (ix0 & 0x007fffff) | 0x00800000
擷取 ix0
的後 23
bit並將第 24
bit 設為 1
,得到
最終得到 接著為了將,若 m
為奇數,將多的 2
乘至 ix0
部分,再將 m
除以 2
得到
又 ,整理如下
1
開始逼近 的數值。fraction
部分擴大至 24
bit(新增 1
的部分),這裡又將 ix0 += ix0
,因此範圍變成,所以為了保證 ix0
最小值 1.fraction
能正確逼近,這裡要從 25
位開始做判斷, QQ0 = (a) 0x01000000
想請問這裡一下,這裡 ix0 += ix0
與 ix0 << 1
在各種方面上有差異嗎?
令 取小數點後 位的精度, 且
這裡以圖解說明逼近過程,首先假設 ix0 = 1.10...
ix0 += ix0
q = s0 = 0
r = 0x01000000
t = s0 + r
也就是 首項 s
為 0
是因為還沒進入小數位
t <= ix0
t = 0x01000000
< ix0 = 0x018XXXXX
s0 = t + r
也就是 s0 = 0x02000000
ix0 -= t
也就是 ix0 = 0x008XXXXX
q += r
q = 0x01000000
ix0 += ix0
ix0 = 0x01XXXXXX
r >>= 1
r = 0x00800000
透過 ix0 += ix0
對 ix0
左移,透過 r >> 1
對 r
右移,不斷逼近 並將逼近後每位數值存於 q
剩下的數值將會根據不同系統上的精度做 rounding
,四捨五入
q
表示的是小數點落在 24~25 bit間的編碼,因此右移一次回到正常範圍(d) 0x3f000000
,照理來講應該加上 0x3f800000
,但因 q = 1.fraction
其最高位的 1
右移時補上了缺口m
表示 exponent
部分,QQ2 = (g) 23
左移回正確位置
因本題無須深入求小數點位的精度要求,因此借用本題方式轉換為接著利用做 Binary search
以此快速縮小範圍,最終回傳 mid
。
給定正整數N,求N能寫成多少種連續正整數的和,假設從 x
開始,且個數共有 k
個
根據等差數列的求和公式
k
與 x
能滿足 N - {0 ~ k}的和 = kx
x = N
對應著公式中的 N
,代表 ZZZ
對應著 {0~k}的和
,因此 i
對應 k
for
迴圈則是用來計算不同終點的等差數列,所以ZZZ = (d) 1 - i
N = 3
N - {0~1}的和 = 2
也就是 x += 1 - i
,因此檢查 x % i
也就是就能知道是否有可行的解N - {0~2}的和 = 0
因 x
於第一個迴圈已被更新,因此算出結果仍然等於 x += 1 - i
,且 x % i == 0
因此得到 x = 0
的整數解一個,以此類推,直到 k = x
。