Эффективный алгоритм для рационализации чисел с плавающей запятой

Имея число с плавающей запятой, я ищу Stringпредставление рационального числа, аппроксимирующего десятичное (с точностью до заданного допуска ε в порядке ). Мой текущий подход таков:

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

Если вы не знакомы с ним,ApintMath.powбудет работать даже с произвольно длинными числами, что хорошо, потому что я пытаюсь преобразовать десятичные дроби тысячами десятичных дробей. места. Производительность моего алгоритма ужасна.

Я приписываю это двум вещам, но их может быть и больше:

  1. Мой подход к получению дроби довольно наивен. Я уверен, что есть лучший способ.
  2. Эта дробь не является упрощенной, поэтому любые последующие вычисления с использованием этой дроби, скорее всего, займут много времени.

Как бы вы это сделали? Есть ли другие области, о которых я не говорил, которые замедляют меня?

6
задан Chris Dennett 2 April 2012 в 17:13
поделиться