는 실수의 비교는 제한된 정밀도 및 최하위 비트의 누적 오차를 설명하기 위해 일부 마진을 필요로한다. 단순한 엡실론 값을 사용하는 것이 일반적인 방법이지만 비교되는 숫자와 관련하여 그 값이 절대적이라는 한계가 있습니다. 적절한 엡실론을 선택하기 위해 비교할 예상 값을 미리 알아야합니다.
비교해야 할 숫자 세트가 넓은 범위를 다루는 경우 작은 값을 제대로 비교하기에는 너무 큰 엡실론으로 끝납니다. 이 상황에서 작은 실수를 비교할 때는 작은 엡실론을, 큰 숫자의 경우 큰 엡실론을 원할 것입니다. 이것은 상대적 오류를 설명하는 비교를 사용하여 수행됩니다.
This page은 절대 오류가 아닌 상대 오류를 사용하여 실수를 비교할 수있는 방법에 대한 개요를 제공합니다. 여기서, ε 파라미터 상대 어떤지를 비교 유효 숫자의 개수를 특정하는 부분이다
-- Adapted from: http://floating-point-gui.de/errors/comparison/
function relatively_equal(a, b, epsilon : real) return boolean is
begin
if a = b then -- Take care of infinities
return true;
elsif a * b = 0.0 then -- Either a or b is zero
return abs(a - b) < epsilon ** 2;
else -- Relative error
return abs(a - b)/(abs(a) + abs(b)) < epsilon;
end if;
end function;
다음 함수는 VHDL의 상대적인 비교의 구현이다.
-- Compare for relative equality to three significant digits
-- These are all considered equal while using the same epsilon parameter
assert relatively_equal(1.001, 1.002, 1.0E-3) report "1.001 != 1.002";
assert relatively_equal(100.1, 100.2, 1.0E-3) report "100.1 != 100.2";
assert relatively_equal(1001.0, 1002.0, 1.0E-3) report "1001 != 1002";
-- Compare for relative equality to four significant digits
-- This will raise the assertion
assert relatively_equal(1.001, 1.002, 1.0E-4) report "1.001 != 1.002";
아니,이 정수를 주장하는 '추가 ... 매력 때마다처럼 작동하지 않습니다 (A-5.3) = 0; assert (a-5.5) = '0';'을 테스트 벤치로 가져옴 ... Prof Kahan의 부동 소수점에 관한 논문을 참고하십시오 - 이것은 최고의 것이 아니지만 www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf –
@ brian-drummond 그건 사실이지만 적어도이 경우에는 부동 소수점 오류를 없애 버리고 내 쉬운 테스트 벤치에서는 괜찮지 만 충분히 좋지는 않습니다. 보다 나은 접근법은 아마도'constant ε : real : = 0.00001'을 정의한 다음''- 5.4 <ε '을 선언하는 것입니다. 그러나 나의 질문은 아직도 남아있다, 이것을하는 좋은 방법 있는가 또는 이것 최고인가? – Johan
assert abs (a-5.4) ε; –