Q&A

  • [급질문] 빼기알고리즘.. 뭐가 잘못되었는지...
안녕하세요. 델파이를 사랑하시는 여러분.. 다음은 빼기 알고리즘입니다. 일반적인 빼기와는 다른 많은 비트수의 빼기를 연산하는것이죠. 그런데 다음의 코딩에 뭔가 문제가 발생했습니다. 특정수를 나눌때 나머지를 얻을수 있을때까지 계속적으로 빼나가는 것인데..많은 비트수를 빼나가다가 어떤 조건이 처리되지 않았는지.. 처음에는 잘 나오다가 나중에는 최종결과값에서는 다른 값이 나오더라구요. 혹시나 이런 비슷한걸 하시는 분 있으시면 어떤 조건처리가 빠졌는지 알려주시면 고맙겠습니다.

참고로 여기에서는 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;

글구 이 함수를 호출한 함수는 나머지를 구할수 있을때까지 계속 순환문을 돌립니다.

1  COMMENTS
  • Profile
    병규 2000.06.10 20:32
    죄송합니다. 제가 글을쓰고 제가 고쳐서글을 올리는군요. 혹시나 이것때문에 고생하실지도 모르는 분을 위해서 알려드릴께요 ^^

    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;

    > 글구 이 함수를 호출한 함수는 나머지를 구할수 있을때까지 계속 순환문을 돌립니다.