2012-02-20 3 views
2

모호한 제목의 사과. 내 문제는 다음과 같습니다. w이 1보다 작은 항목을 가진 벡터 인 경우 두 번째 벡터의 두 배가 v이고 양수 항목의 수가 1보다 작 으면 (아래 재귀를 사용하여 계산 됨) 두 배인 u은 양수보다 작습니다. 하나 sum(v)>1-u까지 재귀부동 소수점 계산

w(i) = RandomNumber(); //A random number from (0,1) - not necessarily uniform 
v(i) = v(i-1)*w(i)*(1-w(i-1))/w(i-1); 

를 사용 v 연장. 문제는 u이 매우 작을 수 있고, v(i)이 (확률 적으로) 감소하기 때문에 너무 작아 질 수 있다는 것입니다. 그리고 우리는 w(i)을 가까이에 둘 수도 있습니다.

이것을 구현하는 가장 안전한 방법은 무엇입니까? 정확성을위한 포인트 :

답변

0

너무 많은 실수없이 부동 소수점을 합하는 일반적인 방법 중 하나는 가장 작은 것에서 가장 큰 것까지 합산하는 것입니다. v(i)의 계산은 v(i-1)에만 의존하기 때문에 이전 노드의 숫자를 각 노드에 보관하고 이전 값은 별도의 변수에 저장하여 정렬 된 트리에 보관할 수 있습니다. 새로운 값을 삽입하거나 노드를 재정렬하면, 그 지점에서 트리를 따라 가면서 합계를 다시 계산해야합니다. 각 노드의 합계는 곧장 추가 될 수도 있고, 카한 합계와 같은 비트를 더 보존 할 수도 있습니다.

-1

v (i)를 누적하고 1-u와 비교하는 대신 1-u로 시작하고 음수가 될 때까지 각 v (i)를 줄이십니까? 정확도는 0에 가까울수록 좋아집니다.

+0

예, 아마도 이것은 작은 u에 대한 OK 근사값을 제공합니다 (정확도가 더 좋음을 의미하는 것인가 -> 0?). 나는 그것에 대해 조금 더 생각해야 할 것입니다. – MMM

+0

두 개의 연속 부동 소수점 값 사이의 거리 (float 또는 double)는 값에 따라 다릅니다. 0에 가까울수록 거리가 짧아집니다 (이것은 내부 표현 때문입니다). 유용한 블로그 게시물 목록은 http://randomascii.wordpress.com/category/floating-point/를 참조하십시오. – Asaf

+0

처음 당신을 잘못 읽으 셨습니다 - 최종 합계가 1-u라는 것을 암시한다고 생각하시지 만, 분명히 옳지는 않지만 지금 당신이 의미하는 바를 봅니다. 감사합니다 – MMM