Java 合理化浮动的性能算法

Java 合理化浮动的性能算法,java,floating-point,rational-numbers,Java,Floating Point,Rational Numbers,给定一个浮点数,我希望得到一个接近小数点的有理数的字符串表示(在给定的公差ε范围内就可以了)。我目前的做法如下: String rationalize(double d) { String s = Double.toString(d); s = s.substring(s.indexOf('.')+1, s.length()); return s + " / " + ApintMath.pow(new Apint(10), s.length()).toString();

给定一个浮点数,我希望得到一个接近小数点的有理数的
字符串
表示(在给定的公差ε范围内就可以了)。我目前的做法如下:

String rationalize(double d)
{
    String s = Double.toString(d);
    s = s.substring(s.indexOf('.')+1, s.length());
    return s + " / " + ApintMath.pow(new Apint(10), s.length()).toString();
}
如果您不熟悉它,它甚至可以处理任意长的数字,这很好,因为我正在尝试将小数转换为数千位小数。我的算法性能很差

我把这归因于两件事,但可能还有更多:

  • 我获取分数的方法非常幼稚。我相信有更好的办法
  • 分数是不简单的,因此使用该分数的任何后续计算都可能会浪费大量时间 你会怎么做?有没有其他我没有提到的地方让我慢下来了?

    这里展示了一个实现,但您必须分析一下,看看哪个更好


    附录:我在线性系统中使用过很好的结果;为可能有用的
    double
    提供多个构造函数。所有这些都会为未定义的值抛出合适的异常。

    同样相关:不幸的是,我用于有理数的库在尝试构造1/0时抛出异常。我不熟悉该库,但这听起来是正确的做法。我在上面列举了一些替代方案。解决了这个问题——使用Stern Brocot树,但缩小了范围,因为我知道我不会有高于或低于特定值的有理数。谢谢你的建议。好主意。仔细看,我发现这忽略了零分母,使用
    Rational(1/0)
    作为正无穷大。请注意,阅读本文的任何人:Stern Brocot树并不比我上面发布的算法快,因为它们得出的答案更慢。但是,它们生成的分数更小,执行计算的速度更快,至少在我的应用程序中是这样。