You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
procedureTForm1.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! 를 호출할 때 오류가 발생합니다.
다음은 사용한 것과 동일한 짧은 형식의 코드 버전입니다.
procedureTForm1.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;
위 코드에 사용된 데이터 유형은 각각 더 큰 중간 값을 보유하기에는 너무 작아서 델파이는 SQR및 StrToInt!
컴파일러에게 명시적으로 Int64해당 유형의 상수를 정의하고 StrToInt64코드를 사용하여 더 큰 데이터 유형을 사용하도록 지시하면 최대 99 999 999 999까지 입력된 값으로 오류 없이 실행됩니다!
───
위의 코드에서 추가 로컬 변수에 중간 값을 저장하기 위해 추가 라인을 사용하여 계산의 어느 부분이 오류를 정확히 일으켰는지 보여줍니다. 의 매개변수 SQR가 너무 크면( Int64사용된 경우에도) 결과 a는 음수입니다. 그러면 SQRT! 를 호출할 때 오류가 발생합니다.
다음은 사용한 것과 동일한 짧은 형식의 코드 버전입니다.
공부하다가 왜 안되는지 너무 궁금해서 스택플로우에 질문후에 답변을 받아작성합니다.
출처 : 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 으로 해도 계산이 잘되네요 이게 더 쉬운방법이지마 나중에 더욱더 큰수를 쓸때는 위 코드를 이용하면좋을것같습니다.
The text was updated successfully, but these errors were encountered: