Skip to content

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

Open
@pioneerprizehun

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 으로 해도 계산이 잘되네요 이게 더 쉬운방법이지마 나중에 더욱더 큰수를 쓸때는 위 코드를 이용하면좋을것같습니다.

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