LINUX.ORG.RU

«округление» недесятичных дробей


0

2

как произвольную дробь «округлить» с заданной другой дробью точностью до «минимального представления»?

например: как из 233333333/500000000 с точностью 1/1234567890 получить 7/15? Ничего кроме перебора на ум не приходит. Алгоритм нужен универсальный

★★★★★

если правильно помню со 2 класса, это называется «простые дроби»

MyTrooName ★★★★★
()

Тут нужна теория чисел. Есть специалисты? Тоже было бы очень интересно узнать такой алгоритм.

prischeyadro ★★★☆☆
()

Гугли приближение вещественных чисел при помощи цепных дробей.

anonymous
()
Ответ на: комментарий от crowbar

наверное нужно смотреть в сторону цепных дробей.

Точно! Спасибо!

(defun cf (cfl)
  (if (cdr cfl)
      (+ (car cfl) (/ 1 (cf (cdr cfl))))
      (car cfl)))

(defun fraction-round (fraction eps)
  (do* ((a (truncate fraction) (truncate (/ 1 x)))
        (x (- fraction a) (- (/ 1 x) a))
        (repr (list a) (append repr (list a)))
        (result (cf repr) (cf repr)))
       ((<= (abs (- fraction result)) eps) result)
    nil))

* (fraction-round 233333333/500000000 1/1234567890)

7/15
yyk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.