Delphi 부동소수점 숫자(실수)에 대한 참고 글
2016.12.14 19:17
아래와 같이 실수를 S1 = S2 형태로 비교하면 같은 숫자인데도 같지 않다고 계산됩니다.
SameValue 등의 함수를 이용하면 같다고 계산됩니다.
uses
System.Math;
procedure TForm1.Button1Click(Sender: TObject);
var
S1, S2: Single;
begin
S1 := 0.3;
S2 := 0.1;
S2 := S2 / 10.0; // should be 0.01
S2 := S2 * 10.0; // should be 0.1 again
S2 := S2 + S2 + S2; // should be 0.3
if S1 = S2 then
ShowMessage('True')
else
ShowMessage('False');
if SameValue(S1, S2) then
ShowMessage('True')
else
ShowMessage('False');
end;
부동소수점 숫자에 대해 잘 소개한 글(영문)이 있어 안내합니다.
http://rvelthuis.de/articles/articles-floats.html
(어느 프로그래밍 언어를 사용하든지 관계없이) 실수 비교는 직접하지 않는 것이 안전합니다.
델파이에서,
실수가 같은 값인지 알고 싶으면 --> SameValue 함수를 사용하세요.
실수를 비교하려면 --> CompareValue 함수를 사용하세요.
두 함수 모두, System.Math 유닛에 들어있습니다.
SameValue에 대한 안내:
DocWiki: http://docwiki.embarcadero.com/Libraries/en/System.Math.SameValue
CompareValue에 대한 안내:
Delphi Basics: http://www.delphibasics.co.uk/RTL.asp?Name=CompareValue
DocWiki: http://docwiki.embarcadero.com/Libraries/en/System.Math.CompareValue