2

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

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

像这样:

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

我什至不知道从哪里开始三角比。

4

4 回答 4

1

您需要将数字除以每个“特殊”数字:pi、e、sqrt(2)、sqrt(3)、sqrt(5)。每次除法后,确定结果数字是否接近精确分数。要完成最后一部分,请使用连分数算法找到数字的良好近似值。您可以在连分数展开式中使用一些标准来确定近似值是否接近准确。如果你得到一个几乎精确的小数字的好分数,那么这就是你的答案 - 分数乘以开始时除以的特殊数字。哦,将“1”视为除数,因此也可以得出简单的分数。

去过那里,做过,效果很好。我不记得在不存储和折叠整个连分数的情况下获得近似分数的算法,但它最近在 SO 上已链接。

于 2011-02-10T00:37:41.597 回答
0

没有人阻止你使用分数。Integer、Double 等只是对象,可以与 4 种操作一起使用:+、-、*、/。您可以使用某种对象 Fraction,它也将执行这些操作(不像运算符,而是像普通方法 - 以 BigInteger 为例),但以自己的方式进行。有关创建新数字类型的某些方面,请参阅SICP,有关 Java 中的实现,请参阅这些说明。

编辑

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

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

这将花费更多时间,但会保持您的数字准确。

于 2011-02-09T23:26:58.360 回答
0

IIRC,芯片使用泰勒多项式计算三角函数,泰勒多项式是一排分数相加。因此,您可以实现该计算并将其保存在分数中。当然会很慢。

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

于 2011-02-09T23:27:54.337 回答
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

基本上,将结果中的分数乘以 Pi,它应该非常接近 decVal。

于 2011-02-10T00:40:45.573 回答