안녕하세요. 델파이를 사랑하시는 여러분.. 다음은 빼기 알고리즘입니다. 일반적인 빼기와는 다른 많은 비트수의 빼기를 연산하는것이죠. 그런데 다음의 코딩에 뭔가 문제가 발생했습니다. 특정수를 나눌때 나머지를 얻을수 있을때까지 계속적으로 빼나가는 것인데..많은 비트수를 빼나가다가 어떤 조건이 처리되지 않았는지.. 처음에는 잘 나오다가 나중에는 최종결과값에서는 다른 값이 나오더라구요. 혹시나 이런 비슷한걸 하시는 분 있으시면 어떤 조건처리가 빠졌는지 알려주시면 고맙겠습니다.
참고로 여기에서는 cardinal자료형을 사용합니다. 그리고 그중에서도 하위 16비트만 연산에 사용하며 상위비트는 0으로 두고 그 이상의 값을 가지면 cardinal변수가 비부호이기 때문에 음수값을 갖는다고 생각하고 처리를 하는 것이지요.
procedure subc2(var C, A, B : array of Cardinal);
var
m, carry : integer;
begin
Carry := 0;
for m := 0 to High(A) do
begin
C[m] := (A[m] - B[m] + carry) and $FFFF;
if (A[m] - B[m] + Carry)<=$FFFF then//$FFFF..16비트만사용 그이상은음수
Carry := 0
else
Carry := -1;
end;
end;
글구 이 함수를 호출한 함수는 나머지를 구할수 있을때까지 계속 순환문을 돌립니다.
if (A[m] - B[m] + Carry)<=$FFFF then//$FFFF..16비트만사용 그이상은음수
여기에서 보면 A[m] -B[m] 이 '0'이고 carry가 -1이라면 값은 -1을 갖게 됩니다 $FFFF보다 항상 작게 되는것이죠. 이해가 가세요? ^^
다음과 같이 고치시면 됩니다.
var
m, carry : integer;
begin
Carry := 0;
for m := 0 to High(A) do
begin
C[m] := (A[m] - B[m] + carry) and $FFFF;
if ((A[m]-B[m])) = 0 and (carry = -1) then
carry := -1
else
if (A[m] - B[m] + Carry)<=$FFFF then
Carry := 0
else
Carry := -1;
end;
end;
병규 wrote:
> 안녕하세요. 델파이를 사랑하시는 여러분.. 다음은 빼기 알고리즘입니다. 일반적인 빼기와는 다른 많은 비트수의 빼기를 연산하는것이죠. 그런데 다음의 코딩에 뭔가 문제가 발생했습니다. 특정수를 나눌때 나머지를 얻을수 있을때까지 계속적으로 빼나가는 것인데..많은 비트수를 빼나가다가 어떤 조건이 처리되지 않았는지.. 처음에는 잘 나오다가 나중에는 최종결과값에서는 다른 값이 나오더라구요. 혹시나 이런 비슷한걸 하시는 분 있으시면 어떤 조건처리가 빠졌는지 알려주시면 고맙겠습니다.
> 참고로 여기에서는 cardinal자료형을 사용합니다. 그리고 그중에서도 하위 16비트만 연산에 사용하며 상위비트는 0으로 두고 그 이상의 값을 가지면 cardinal변수가 비부호이기 때문에 음수값을 갖는다고 생각하고 처리를 하는 것이지요.
> procedure subc2(var C, A, B : array of Cardinal);
> var
> m, carry : integer;
> begin
> Carry := 0;
> for m := 0 to High(A) do
> begin
> C[m] := (A[m] - B[m] + carry) and $FFFF;
> if (A[m] - B[m] + Carry)<=$FFFF then//$FFFF..16비트만사용 그이상은음수
> Carry := 0
> else
> Carry := -1;
> end;
> end;
> 글구 이 함수를 호출한 함수는 나머지를 구할수 있을때까지 계속 순환문을 돌립니다.