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树并不比我上面发布的算法快,因为它们得出的答案更慢。但是,它们生成的分数更小,执行计算的速度更快,至少在我的应用程序中是这样。