2012-10-11 3 views
4

일반적으로 두 개의 부동 소수점은 매우 작은 수의 범위 내에 있는지 비교하여 비교합니다. 테이블 키는 키를 모른 채 존재하는지 여부를 모르기 때문에 작동하지 않습니다 (의미가있는 경우). 소수점 오류 부동를 차지하면서테이블 인덱스의 루아 부동 소수점 오류

기본적으로
a, b, c = 1.7, -0.8, -0.4 
d = a + b + c -- prevents constant folding 
print(string.format('%1.20f', d)) -- 0.49999999999999989000 (around 0.5) 
assert(d ~= 0.5) 
t = {[0] = 'foo', [0.5] = 'bar'} 
print(t[d]) -- nil (I want it to print 'bar') 

, 어떻게 내가 테이블의 키를 찾을 수 있습니다 : 64 비트 컴퓨터에 루아 5.1

예? 테이블의 각 키를 비교하지 않고도 작업 할 수 있기를 원하기 때문에 큰 테이블을 사용하여도 여전히 빠를 수 있습니다. 이미이 기능을 내장 할 수있는 기능이 있지만 아마도 찾을 수 없습니다.

도움이 될 것입니다.

답변

4

다른 소스에서 오는 부동 소수점 숫자를 실제로 인덱싱해야하는 경우, 고정 소수점 이하 자릿수의 고정 된 형식으로 문자열로 변환하여 해당 문자열로 테이블을 인덱싱하고 색인을 생성하는 것이 좋습니다.

프록시 테이블에 대해 적절한 __newindex 메타 메서드를 설정하면 자동으로이를 수행 할 수도 있습니다.

+0

감사합니다. 나는 그것에 대해서 생각조차하지 않았습니다. 또한 __newindex를 사용한 멋진 트릭! – Ryan

+1

고정 숫자로 곱한 다음'math.floor'를 사용하는 방법은? – Deco

+1

@Deco, 잘 작동하지만 잠재적 인 오버 플로우에주의해야합니다. – lhf