contributed by < RusselCK
>
RusselCK
fdiv.c
)假設 divop()
的第二個參數必為大於 0
的整數,而且不超過 int
型態能表達的數值上界
程式碼解析:
orig
為 被除數, slots
為除數
orig
的型態 為 雙精度浮點數 ( double
)od
判斷 除數 slots
是否為 偶數
slots
為偶數,則 od
為 0slots
為奇數,則 od
為 1slots
為 偶數,則 被除數 orig
與 除數 slots
同除以 2,除法結果不變
divop(double orig, int slots)
= divop(orig / 2, slots >> 1)
2
先看一個數學推導:
若 除數 slots
為 奇數,搭配 上述推導 與 先處理除以 2 的概念
divop(double orig, int slots)
= result
+ divop(result, slots)
result
= divop(orig / 2, (slots + 1) >> 1)
單精度浮點數
程式碼解析:
x
型態轉換成 32 bit 的整數 ix0
( 1 00000000 0000...0000 )
及 ( 0 00000000 0000...0000 )
sign
= 0x80000000
= ( 1000 0000 ... 0000 )
~sign
= 0x7fffffff
= ( 0111 1111 ... 1111 )
( 0 11111111 0000...0000 )
( * 11111111 ****...**** )
#49
: m
為 浮點數表示 的 Exponent 部份m
為 0,代表該浮點數為 Denormalized( * 00000000 ****...**** )
**** … **** )
#51
~ #53
)
舉例:
( 0.00001***…*** )2 = ( 1.*** … *** )2 *
i
= 6 ( for迴圈 i++ 特性 ,可參考 quiz4 Q2)
m
= -5
( 0 00000001 0000...0000 )
#55
: 由於浮點數使用 Exponent Bias
( 0 00000000 1111...1111 )
ix0
只剩 Fraction 的部份
ix0
ix0
Generate Bit by Bit ( 數學推導 ):
回到程式碼:
#63
:
ix0 += ix0
),來修正這個錯位r
:
q
精確到小數點後第 23 位 ( #bits of Fraction )r
= ( 0000 0001 0000 0000 0000 0000 0000 0000 ) = 0x01000000
q
已完成進位,小數點後第 24 位可以安心捨去#91
: 設置 Fraction 及 Exponent Bias
0x3f000000
( 0 0111111 0000....0000 )
#92
: 設置 Exponent
23
ix0
轉回 浮點數型式int sqrt(int x)
.整數的牛頓法 在 8 和 214739599 會收斂在 正解+1 的地方
效能評估:
#8
: 考慮不同機器的 右移 特型,使用 unsigned int
#11
: 調整 停止條件
N
, how many ways can we write it as a sum of consecutive positive integers?Input: 15
Output: 4
Explanation: 15 = 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5
假設等差數列 ( 差值為 1 ) 從 開始,且個數共有 個
則此等差數列為
且令其合為
則
i
= 數學推導中的 1 - i
ret
為 符合的 的個數效能評估:
效能評估:
延續 Q4. 的推導
必定可拆解成 奇數 偶數
的不同奇因數個數
若 為質數,則只有 2 種解
程式碼解析
求得 的不同奇因數個數 ret
( N 為質數時除外 ),請配合上面的數學推導觀看
count
= i
代表 奇數逐一檢查所有可能的奇數
N
/i
後再檢查一次目前世上並沒有不使用迴圈就能判定 N 是否為質數的方法
因此,利用 i * i<= N
作為可進入迴圈的條件,可在 為質數時不進入迴圈
若 為質數,答案應該為 2
效能評估: