Al principio me las prometí muy felices haciendo un script y poniéndolo en marcha conseguir los datos de ejecución. La primera versión del código es la siguiente:

; Calcular pi con la fórmula de Bailey-Borwein-Plouffe (define (ochok k) (* 8 k)) (define (termino k) (let ([n (ochok k)]) (- (/ 4 (+ n 1)) (/ 2 (+ n 4)) (/ 1 (+ n 5)) (/ 1 (+ n 6))))) (define (bbp i) (* (/ 1 (expt 16 i)) (termino i))) (define (calcular-pi precision) (if (< precision 0) 0 (+ (bbp precision) (calcular-pi (- precision 1))))) (display (calcular-pi 10000)) (newline)

Como se puede ver utilizo la fórmula de Bailey-Borwein-Plouffe para calcular pi. Esta fórmula está mejor explicada en su correspondiente artículo de la wikipedia de lo que yo podría explicarla aquí, no entraré, pues, en esos detalles.

El código funcionó con ambos scheme sin modificar un paréntesis. Sin embargo, las primeras pruebas me parecieron tan escandalosamente dispares que me entretuve en pensar que quizá estaba siendo injusto con uno de los entornos. La salida de cada uno de los schemes era muy distinta: Chicken devolvía un escueto 3.14159265358979 y ya está, mientras Racket devolvía un cociente de números enormes que tardaban segundos en ser escritos en pantalla. La única línea que se añadió en el fichero pi-decimales.rkt que no está en el pi-decimales.scm fue la definición del lenguaje que necesita Racket para ejecutar el código:

#lang racket/base

Sin embargo, la diferencia que había en la salida de los dos scripts, el .rkt y el .scm seguía pareciéndome muy significativa y quizá debía corregirlo. Lo que hice fue forzar a Racket para que calculara también pi de forma inexacta y para eso utilicé el siguiente código:

#lang racket/base ; Calcular pi con la fórmula de Bailey-Borwein-Plouffe (define (ochok k) (exact->inexact (* 8 k))) (define (termino k) (let ([n (ochok k)]) (- (/ 4 (+ n 1)) (/ 2 (+ n 4)) (/ 1 (+ n 5)) (/ 1 (+ n 6))))) (define (bbp i) (* (/ 1 (expt 16 i)) (termino i))) (define (calcular-pi precision) (if (< precision 0) 0 (+ (bbp precision) (calcular-pi (- precision 1))))) (display (calcular-pi 10000)) (newline)

Básicamente es el mismo código, pero en la función ochok se fuerza el cálculo con exact->inexact . El resto de cálculos arrastran esa conversión y el resultado final es el esperado 3.141592653589793.