2014-11-14 16 views
1

我正在編寫一個C程序來執行固定點的2個複數分割。 我無法從中得到小數部分。以下是更多細節。使用固定點的複雜分部

我有2個複數:

N = a + ib 
M = c + jd 

我需要做N/M在固定點(不使用浮點)

對上述複數的示例值可以是:

a = 1.55, b = 1.44, c = 1.24, d = 0.55 

N = 1.55 + i(1.44) 
M = 1.24 + j(0.55) 

對於轉換爲固定點,我將這些a,b,c和d與2^14相乘。 之後,他們成爲:

a = 0x6333, b = 0x5c28, c = 0x4f5c and d = 0x2333 

然後執行N/M操作我做的:

N/M = (a + ib)/(c + jd) = ((a + ib) * (c - jd))/((c + jd) * (c - jd)) 

然後單獨的實部:

(ac + bd)/(c^2 + d^2) 

等..

我面臨的問題是我不理解如何獲得來自該部門的小數部分。 我只得到小數部分,其中大部分是1或0.

獲得小數部分的正確方法是什麼?在上面的例子中,真實部分應該是1.47490。但我只能得到1.

任何人都可以請幫助我以正確的方式做固定點的複雜部門?

非常感謝。

+0

爲a,b,c,d使用浮點變量!或者將任何一個操作數轉換爲浮點數 – Venkatesh

+1

首先嚐試使用真正的固定算術:例如, (a/b)?我敢打賭你會得到1而不是(16384 * 1.55/1.44)。 –

回答

0

在定點除法和乘法運算中,必須注意結果值也必須具有比例因子K

in addition/subtraction: 
a * K + b * K = K * (a + b) 

in multiplication: 

(a * K) * (b * K) = K^2 * (a * b) --> must compensate with 1/K 
proper form: (aK * bK)/K 

in division: 

(a * K)/(b * K) = a/b  --> must pre-multiply with K 
proper form: (aK * K)/(bK) 
0

對於兩個複雜X=a+jbY=c+jd,其中j=sqrt(-1)abcd是實數,師X/Y

(ac+bd)/(c^2+d^2) + j(bc-ad)/(c^2+d^2) 

給我們K = 2^14,二進制數的正如你所提到的那樣,保存這個分數 讓Aa的固定數字表示,即A = a * K,並且類似地讓B = b*K,C=c*K和最後D=d*K。假設你的號碼不夠大溢出計算機的整數,在以下計算:

你應該先計算U = A * C + B * DV = C * C + D * DW = B * C - A * D 然後,您應該計算V' = V >> 14。然後,X/Y的實數部分是U/V',並且X/Y的虛數部分是W/V',其中兩部分都以您的定點形式表示。