Open
Description
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;
공부하다가 왜 안되는지 너무 궁금해서 스택플로우에 질문후에 답변을 받아작성합니다.
delphi coder 님 (https://stackoverflow.com/users/11329562/delphi-coder)
[추가답변]
오리지날코드에
6350000 -> 6350000.0 으로 해도 계산이 잘되네요 이게 더 쉬운방법이지마 나중에 더욱더 큰수를 쓸때는 위 코드를 이용하면좋을것같습니다.
Metadata
Metadata
Assignees
Labels
No labels