2011-02-09 4 views
2

Android 용 "triangle solver"앱을 쓰고 있는데 trig 비율과 라디안 측정 값에 대한 정확한 값을 구현할 수 있는지 궁금합니다. 예를 들어, 90 도는 1.57079632679 대신 "pi/2"로 출력됩니다.trig 함수의 정확한 값을 계산하는 방법은 무엇입니까?

정확한 값을 얻으려면 pi로 나누고 분수. 어떻게 십진수를 분수로 변환 할 수 있을지 모르겠다. 이 같은

:

int decimal = angleMeasure/Math.PI; 
someMethodToTurnItIntoAFraction(decimal); 

나는 경우에도 삼각 비율로 시작하는 모른다.

+1

왜 180도를 "180도"로 출력하지 않습니까? –

+0

이것은 특정 값에 대한 용도로만 사용됩니다. 예를 들어 무엇을 표시하겠습니까? 179도? –

+0

각도가 아닌 라디안 측정 값의 정확한 값을 계산하려고합니다. 비록 정확한 분수 값이 그러한 값에 존재하는지 감지 할 수있는 몇 가지 진술을 포함하고 있다고 가정합니다 ... – user610367

답변

1

당신은 "특별한"각 숫자에 의해 수를 가지고 그것을 분할해야 : 파이, 전자, SQRT (2), SQRT (3), SQRT (5). 각 나누기 후에 결과 숫자가 정확한 분수에 가까운 지 확인하십시오. 마지막 부분을 수행하려면 연속 소수 알고리즘을 사용하여 숫자에 대한 좋은 근사를 찾으십시오. 근사값이 거의 정확한지 판단하기 위해 연속 분수 확장에서 사용할 수있는 기준이 있습니다. 거의 정확하지 않은 작은 숫자의 좋은 분수를 얻는다면 그것이 답입니다 - 분수는 처음에 나누어 진 특별한 숫자입니다. 오, 제수로 "1"을 고려하면 간단한 분수도 나오게됩니다.

그곳에 가면 제대로 작동합니다. 나는 전체 분수를 저장하고 붕괴하지 않고 근사 분수를 얻기위한 알고리즘을 생각해 내지 못했지만 최근에 여기에 링크되어 있습니다.

+0

나를 두들겨라,하지만 너에게 좋다 +1. [정수 관계 찾기] (https://secure.wikimedia.org/wikipedia/en/wiki/Integer_relation_algorithm) –

+0

유일한 문제는 특별한 숫자가 많이 있다는 것입니다. – dvitek

+0

@drvitek - 다른 특수 숫자는 무엇입니까? 그곳에? 분수 부분은 자동으로 발견됩니다. – phkahler

0

분수를 사용하지 못하게하는 사람이 없습니다. Integer, Double 등은 +, -, *,/등 4 가지 연산과 함께 사용할 수있는 객체입니다. 어떤 종류의 오브젝트 부분을 사용할 수 있습니다.이 연산자도 연산자를 사용하지는 않지만 일반 메소드처럼 사용합니다. 예를 들어 BigInteger를 고려해보십시오. 그러나 이러한 방식으로 수행하십시오. 새로운 숫자 형식을 만드는 몇 가지 측면에 대해서는 SICP을 참조하고 Java 구현에는 these 메모를 참조하십시오.

편집

내가 무엇을 의미 당신의 someMethodToTurnItIntoAFraction을 생성하지만, 자연 분수 자체를 사용하지 않습니다. 나는. 귀하의 코드는 다음과 같습니다 :

Fraction f = new Fraction(angleMeasure, Fraction.PI); 
System.out.println(f.getNum() + "/" + f.getDen()); 

시간이 많이 걸리지 만 정확한 숫자를 유지할 것입니다.

0

IIRC 칩은 분수의 추가 행인 Taylor 's polynom을 사용하여 삼각 함수를 계산합니다. 따라서 계산을 구현하고 분수로 유지할 수 있습니다. 물론 느려질 것입니다.

http://en.wikipedia.org/wiki/Taylor_series

+0

분수 처리가 훨씬 쉬우 며 테일러 시리즈를 계산합니다. – ffriend

0

당신이 말하는 것은 Pi를 숫자 대신 개념으로 사용하는 것입니다. 나는 이런 식으로 뭔가를 할 거라고 :

class Fraction { 
    public int num; 
    public int den; 
    public Fraction(int n,int d) { 
     num=n; 
     den=d; 
    } 
    public Fraction() { 
     num=1; 
     den=1; 
    public double decValue() { 
     return ((double)num)/((double)den); 
    } 
} 

옹알, 옹알을 ....

public static Fraction someMethod(double decVal) { 
    Fraction f=new Fraction(1,1); 
    double howclose=0.0000001; //tiny amount of error allowed 
    while(abs((f.decValue()*Math.PI)-decVal)>howclose) { 
     if(f.decValue()*Math.PI>decVal) { 
      f.den++; 
     } 
     else { 
      f.num++; 
     } 
    } 
    return f; 
} 

기본적으로, 예상 답변 (decVal)의 비율이 점점 더 가까이 점점에서 작동합니다.
num*PI 
------ 
den 

는 기본적으로, 파이로 결과에서의 분율을 곱하면, 그것은 가까운 decVal에 매우해야한다 : 분수는의 형태로 될 것입니다.

+0

소스 코드의 형식을 포함하여 텍스트를 아름답게 만드는 방법에 대한 정보는 [Markdown help page] (http://stackoverflow.com/editing-help)를보십시오. – ffriend

관련 문제