2014-11-14 17 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',其中两部分都以您的定点形式表示。