Thiele's interpolation formula: Difference between revisions

Content added Content deleted
m (Updated D entry)
Line 882: Line 882:
#"{$atan}"
#"{$atan}"
4*$atan.InvokeReturnAsIs(1)</lang>
4*$atan.InvokeReturnAsIs(1)</lang>

=={{header|Racket}}==
<lang racket>
#lang racket
(define xs (for/vector ([x (in-range 0.0 1.6 0.05)]) x))
(define (x i) (vector-ref xs i))

(define-syntax define-table
(syntax-rules ()
[(_ f tf rf if)
(begin (define tab (for/vector ([x xs]) (f x)))
(define (tf n) (vector-ref tab n))
(define cache (make-vector (/ (* 32 31) 2) #f))
(define (rf n thunk)
(or (vector-ref cache n)
(let ([v (thunk)])
(vector-set! cache n v)
v)))
(define (if t) (thiele tf x rf t 0)))]))

(define-table sin tsin rsin isin)
(define-table cos tcos rcos icos)
(define-table tan ttan rtan itan)

(define (rho x y r i n)
(cond
[(< n 0) 0]
[(= n 0) (y i)]
[else (r (+ (/ (* (- 32 1 n) (- 32 n)) 2) i)
(λ() (+ (/ (- (x i) (x (+ i n)))
(- (rho x y r i (- n 1)) (rho x y r (+ i 1) (- n 1))))
(rho x y r (+ i 1) (- n 2)))))]))
(define (thiele x y r xin n)
(cond
[(> n 31) 1]
[(+ (rho x y r 0 n) (- (rho x y r 0 (- n 2)))
(/ (- xin (x n)) (thiele x y r xin (+ n 1))))]))

(* 6 (isin 0.5))
(* 3 (icos 0.5))
(* 4 (itan 1.))
</lang>
Output:
<lang racket>
3.141592653589793
3.1415926535897936
3.1415926535897953
</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==