2014-11-14 5 views
1

고정 점에 2 복소수의 나눗셈을 수행하는 C 프로그램을 작성하고 있습니다. 부분 부분을 가져올 수 없습니다. 아래에 그것에 대한 자세한 내용입니다.고정 소수점을 사용한 복소 분할

I 2 개 복소수 가지고있을 수

I 고정 포인트 N/M 할 필요
N = a + ib 
M = c + jd 

(부동 소수점 사용하지 않고) 상기 복소수

값 예시 :

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을 곱합니다. 그 후 그들은이 될 : 혼자 실수 부에 대한 다음

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

:

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

그럼 내가 할 N/M 작업을 수행 할 수

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

등등 ..

내가 직면 한 문제는 내가 어떻게 문제를 해결할 수 있는지 이해하지 못한다는 것이다. 부문에서 분수 부분. 대부분 1 또는 0 인 소수 부분 만 표시됩니다.

소수 부분을 가져 오는 올바른 방법은 무엇입니까? 위의 예에서 실수 부분은 1.47490과 같아야합니다. 그러나 나는 단지 1을 얻을 수 있습니다.

고정 포인트에 대한 복잡한 부문을 수행하는 올바른 방법을 누군가가 도와 줄 수 있습니까?

대단히 감사합니다.

+0

a, b, c, d에 대해 float 변수를 사용하십시오 !!! 또는 피연산자 중 하나를 부동 문자로 변환하십시오. – Venkatesh

+1

먼저 실제 고정 산술 연산을 시도해보십시오. (a/b)? 나는 당신이 (16384 * 1.55/1.44) 대신에 1을 얻을 것이라고 확신한다. –

답변

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)a, b, c 들어 d는 실수이고, 분할 X/YK = 2^14 이진 디지트를 들어 보자

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

주어진다 당신이 언급 한 것처럼 분수를 절약 할 수 있습니다. Aa의 고정 숫자로 표시하고, 즉 A = a * K으로하고, 마찬가지로 B = b*K, C=c*K, 그리고 마지막으로 D=d*K으로 지정합니다. 전화 번호는 다음과 같은 계산에, 컴퓨터의 정수 오버 플로우 충분히 크지 가정 : 먼저 다음 U = A * C + B * D, V = C * C + D * D, W = B * C - A * D 을 계산한다

, 당신은 V' = V >> 14을 계산해야한다.그런 다음 X/Y의 실수 부분은 U/V'이고 X/Y의 허수 부분은 W/V'이고 두 부분은 모두 고정 소수점 형식으로 표시됩니다.