2013-07-08 5 views
1

그래서 다음의 문제를 제시하고있다 :삼각 정확도

"파라볼라 때 Y = X2/K, 세 점 A (A, A2/K), B (b, B2/K) 및 C (c, c2/k)가 선택된다 .F (K, X)는 삼중 항 ABC의 적어도 하나의 각도 45도 1 ≤ K ≤ K 및 -X ≤ < B <의 C ≤ X의

, F (1, 10) = (41) 및 F (10, 100) = 12492. 찾기로 인 F (106, 109). " A와 B 쎄타 = COS^-1 (| A | * | | B) (A 점 B) /() : 목적에

내가 내적의 기하학적 정의를 악용을 해결 유클리드 벡터, | A | A의 크기를 나타내고, 세타는 그들 사이의 각도입니다.

필자의 스크립트를 여러 번 읽었으며 FoKX = 41 대신 FoKX = 22가 나오는 유일한 이유는 삼각법 정확도 또는 라디안에서도 단위로의 변환에 오류가 있다는 것입니다. . 이것이 사실인지 또는이 문제를 설명 할 수있는 어딘가에서 실수를 범한 경우 알려주십시오. 항상 도움을 주셔서 감사합니다!

K<-1 
X<-10 
FoKX<-0 
for(l in 1:K){ 
    for(i in (-X):(X-2)){ 
    for(j in (i+1):(X-1)){ 
     for(k in (j+1):X){ 
     vecAB<-c(j-i,(j^2-i^2)/l) 
     vecAC<-c(k-i,(k^2-i^2)/l) 
     vecBA<--vecAB 
     vecBC<-c(k-j,(k^2-j^2)/l) 
     vecCA<--vecAC 
     vecCB<--vecBC 
     magAB<-sqrt(sum(vecAB^2)) 
     magAC<-sqrt(sum(vecAC^2)) 
     magBA<-magAB 
     magBC<-sqrt(sum(vecBC^2)) 
     magCA<-magAC 
     magCB<-magBC 
     ABdotAC<-sum(vecAB*vecAC) 
     BAdotBC<-sum(vecBA*vecBC) 
     CAdotCB<-sum(vecCA*vecCB) 
     angA<-acos(ABdotAC/(magAB*magAC)) 
     angB<-acos(BAdotBC/(magBA*magBC)) 
     angC<-acos(CAdotCB/(magCA*magCB)) 
     if(angA==pi/4||angB==pi/4||angC==pi/4){ 
      FoKX<-FoKX+1 
     } 
     } 
    } 
    } 
} 
+1

부동 소수점 문제 일 수 있습니다. http://stackoverflow.com/questions/9508518/why-are-these-numbers-not-equal – Aaron

+0

을 참조하십시오. 이 링크를 가져 주셔서 감사합니다. – fowlslegs

+0

그리고 F (10^6,10^9)를 계산하는 데 너무 오래 걸리는 무차별 대입 알고리즘을 작성했습니다. 나는 그 carots를 놓치고 있었다! 드로잉 보드로 돌아갑니다. – fowlslegs

답변

4

부동 소수점과 완전 함을 비교하지 마십시오. 항상 모호성 계수를 포함하십시오. (맥주 무료, 당신이 원하는대로 무료 등 수정)

approxeq <- function(x, y, tolerance = .Machine$double.eps^0.5,...) { 
    #input validation 
    if (length(x) != length(y)) warning('x,y lengths differ. Will recycle.') 
    #don't care about dimensions so long as you're smart about inputs 
    checkit <- abs(x-y) < tolerance 
    return(invisible(checkit)) 
} 

이 논리 벡터를 반환 달리 : 부동 소수점 평등을 처리 할 때

 .... 
     .... 
     if(abs(angA - pi/4) < 1e-9 || 
      abs(angB - pi/4) < 1e-9 || 
      abs(angC - pi/4) < 1e-9){ 
      FoKX<-FoKX+1 
     } 
     } 
    } 
    } 
} 

FoKX 
[1] 41 
+0

이것으로 해결됩니다! 고맙습니다. – fowlslegs

+0

더 정확한 방법은 다음과 같습니다 :'if (is.equal (allAqual (angA, pi/4)) || is (모든 .qual (angB, pi/4)) || isTRUE pi/4)))'. Aaron의 권장 링크 인 stackoverflow.com/questions/9508518/을 참조하십시오. – fowlslegs

2

나는 도움이 광산의 장난감을 찾을 수 자체 내장 된 all.equal.