Trying to learn METAFONT (act.)
Pythagorean addition $\sqrt{a^2+b^2}$
Estava a "tentar" aprender METAFONT, o significado das aspas tornar-se-á claro em poucos instantes, e dei com o seguinte comentário escrito pelo próprio Knuth
Pythagorean addition is implemented by an elegant iterative scheme due to Cleve Moler and Donald Morrison IBM Journal of Research and Development 27 (1983), 577—581. It modifies |a| and |b| in such a way that their Pythagorean sum remains invariant, while the smaller argument decreases.
E, justifica-se as aspas, tive de descobrir o artigo (não encontrei outro sítio para o ler) e implementar o código em Lisp.
(defun pythag (a b &optional tol) "Pythagorean addition $\sqrt{a^2+b^2}$ is implemented by an elegant iterative scheme due to Cleve Moler and Donald Morrison IBM Journal of Research and Development 27 (1983), 577--581. It modifies |a| and |b| in such a way that their Pythagorean sum remains invariant, while the smaller argument decreases." (if (>= a b) (pythag b a tol) (if (<= a (if tol tol (expt 10.0 -16))) b (let* ((r (expt (/ a b) 2)) (s (/ r (+ 4 r))) (b (+ b (* 2 s b))) (a (* s a))) (pythag a b tol)))))
> (pythag 1.0 2.0 .000001) 2.236068 > (expt 5 .5) 2.236068
e com a operação inversa
(defun pythag (pm a b &optional tol) "Pythagorean addition $\sqrt{a^2\pm b^2}$ is implemented by an elegant iterative scheme due to Cleve Moler and Donald Morrison IBM Journal of Research and Development 27 (1983), 577--581. It modifies |a| and |b| in such a way that their Pythagorean sum remains invariant, while the smaller argument decreases. pm -> +1 gives sqrt(a^2+b^2); pm -> -1 gives sqrt(a^2-b^2);" (if (>= a b) (pythag pm b a tol) (if (<= a (if tol tol (expt 10.0 -16))) b (let* ((r (* pm (expt (/ a b) 2))) (s (/ r (+ 4 r))) (b (+ b (* 2 s b))) (a (* s a))) (pythag pm a b tol)))))
Voltando ao METAFONT.
Palavras chave/keywords: Metafont, LaTeX, Pythagorean addition, lispCriado/Created: NaN
Última actualização/Last updated: 10-10-2022 [14:26]
(c) Tiago Charters de Azevedo