Skip to content

모듈4_2번문제 [64부터 계산이안되는이슈] #3

Description

@pioneerprizehun
procedure TForm1.Button1Click(Sender: TObject);
var
  r:real;
begin
  r := SQRT(SQR(6350000 + StrToint(Edit1.Text)) - SQR(6350000));
  Edit2.Text := FloatToStr(r / 1000);

end;

위 코드에 사용된 데이터 유형은 각각 더 큰 중간 값을 보유하기에는 너무 작아서 델파이는 SQR및 StrToInt!

컴파일러에게 명시적으로 Int64해당 유형의 상수를 정의하고 StrToInt64코드를 사용하여 더 큰 데이터 유형을 사용하도록 지시하면 최대 99 999 999 999까지 입력된 값으로 오류 없이 실행됩니다!

───
위의 코드에서 추가 로컬 변수에 중간 값을 저장하기 위해 추가 라인을 사용하여 계산의 어느 부분이 오류를 정확히 일으켰는지 보여줍니다. 의 매개변수 SQR가 너무 크면( Int64사용된 경우에도) 결과 a는 음수입니다. 그러면 SQRT! 를 호출할 때 오류가 발생합니다.

다음은 사용한 것과 동일한 짧은 형식의 코드 버전입니다.

procedure TForm1.Button1Click(Sender: TObject);
const
  v: int64 = 6350000;
var
  r: real;
begin
  Edit2.Clear;
  r := SQRT(SQR(v + StrToInt64(Edit1.Text)) - SQR(v));
  Edit2.Text := FloatToStr(r / 1000);
end;

공부하다가 왜 안되는지 너무 궁금해서 스택플로우에 질문후에 답변을 받아작성합니다.

출처 : https://stackoverflow.com/questions/73117661/why-is-this-code-causing-an-invalid-floating-point-operation-error/73118396#73118396

delphi coder 님 (https://stackoverflow.com/users/11329562/delphi-coder)

[추가답변]
오리지날코드에
6350000 -> 6350000.0 으로 해도 계산이 잘되네요 이게 더 쉬운방법이지마 나중에 더욱더 큰수를 쓸때는 위 코드를 이용하면좋을것같습니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions