2011-02-09 60 views
2

我正在为Android编写一个“三角解算器”应用程序,我想知道是否可以实现三角比率和弧度测量的精确值。例如,90度将输出为“pi/2”而不是1.57079632679 ...如何计算trig函数的精确值?

我知道,为了得到弧度量度的精确值,我将它除以pi并将其转换为分数。我不知道如何将小数转换为分数。

这样的:

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

我甚至不知道从哪里开始与三角函数的比例。

+1

为什么不输出180度为“180度” – 2011-02-09 20:48:58

+0

这只是对特定值有任何用处;您希望它显示哪些内容179度? – 2011-02-09 20:50:43

+0

我正在尝试计算弧度度量的精确值,而不是度数。虽然我想只是包含一些语句来检测这个值是否存在确切的分数值...... – user610367 2011-02-09 20:52:19

回答

1

需要由每个 “特殊” 的数字来采取的数目和划分它:圆周率,E,SQRT(2),SQRT(3),SQRT(5)。每次划分后,确定结果数字是否接近确切分数。要做最后一部分,使用续分数算法找到数字的很好的近似值。您可以在连续分数展开中使用标准来确定近似是否近似。如果你得到一个很小的数字几乎是精确的分数,那么这就是你的答案 - 分数乘以开始时除以的特殊数字。哦,把“1”看作是一个除数,那么简单的分数也会出来。

在那里,做到了,效果很好。我不记得获取近似分数的算法,但没有存储和折叠整个连续分数,但最近它已经与SO相关联。

0

没有人阻止你使用分数,因为他们来了。 Integer,Double等只是对象,可以与4个操作一起使用:+, - ,*,/。你可以使用某种对象分数,它也会执行这些操作(不像运算符,但像普通方法 - 考虑BigInteger的例子),但以它自己的方式执行。有关创建新号码类型的某些方面,请参阅SICP,有关用Java实现的内容,请参阅these笔记。

编辑

我的意思是不是创建someMethodToTurnItIntoAFraction,但使用天然分数本身。即您的代码如下所示:

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

这将需要更多时间,但会保持您的号码精确。

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); 
    } 
} 

yadda,yadda ....

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。