Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
pioneerprizehun opened this issue Jul 26, 2022 · 0 comments
Open

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

pioneerprizehun opened this issue Jul 26, 2022 · 0 comments

Comments

@pioneerprizehun
Copy link

pioneerprizehun commented Jul 26, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant