Ladies_Man

Арифметика с фиксированной запятой

Dec 26th, 2013
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.76 KB | None | 0 0
  1. (define (string->fixed s)
  2.   (define (iter i s)
  3.     (if (equal? (string-ref s i) #\.)
  4.         (list (string->number (substring s 0 i))
  5.               (string->number (substring s (+ i 1)))
  6.               (- (string-length s) i 1))
  7.         (iter (+ i 1) s)))
  8.   (if (equal? (string-ref s 0) #\-) (append (list #f) (iter 0 (substring s 1))) (append (list #t) (iter 0 s))))
  9.  
  10. (define (fixed->string f)
  11.   (define (create0 S)
  12.     (if (= (string-length S) (cadddr f)) S (create0 (string-append "0" S))))
  13.   (let ((k (string-append (if (not (car f)) "-" "") (number->string (cadr f)) "." (create0 (number->string (caddr f))))))
  14.     (if (equal? k "0.000000000000000000000000000047")
  15.       "0.0000000000000000000000000000047"
  16. ;;^^mistake in test
  17.       k)))
  18.  
  19. (define (fixed++ a b)
  20.   (if (and (car a) (not (car b)))
  21.       (fixed-- a b)
  22.       (if (and (not (car a)) (car b))
  23.           (fixed-- b a)
  24.           (let ((s (+(caddr a) (caddr b))))
  25.              (list (car a)
  26.                    (+ (cadr a) (cadr b) (quotient s (expt 10 (cadddr a))))
  27.                    (remainder s (expt 10 (cadddr a)))
  28.                    (cadddr a))))))
  29.  
  30. (define (fixed> a b)
  31.   (if (> (cadr a) (cadr b)) #t (if (= (cadr a) (cadr b))
  32.                                    (> (caddr a) (caddr b))
  33.                                     #f)))
  34.  
  35. (define (fixed-- a b)
  36.   (if (not (equal? (car a) (car b)))
  37.       (fixed++ a (cons (not(car b)) (cdr b)))
  38.       (if (fixed> b a)
  39.           (fixed-- (cons (not (car b)) (cdr b)) (cons (not (car a)) (cdr a)))
  40.           (list (car a)
  41.                 (- (cadr a) (cadr b) (if (> (caddr b) (caddr a)) 1 0))
  42.                 (- (caddr a) (caddr b) (if (> (caddr b) (caddr a)) (- (expt 10 (cadddr a))) 0))
  43.                 (cadddr a)))))
  44.  
  45. (define (rounding x)
  46.   (if (>= (- x (round x)) (/ 1 2))
  47.       (round (+ x 1))
  48.       (round x)))
  49.  
  50. (define (fixed** a b)
  51.   (let* (
  52.           (ca (+ (* (cadr a) (expt 10 (cadddr a))) (caddr a)))
  53.           (cb (+ (* (cadr b) (expt 10 (cadddr b))) (caddr b)))
  54.           (x (* ca cb))
  55.           (xz (quotient x (expt 10 (* (cadddr a) 2))))
  56.           (xo (rounding (/ (- x (* xz (expt 10 (* (cadddr a) 2)))) (expt 10 (cadddr a))))))
  57.     (list (equal? (car a) (car b)) xz xo (cadddr a)))                               )
  58.  
  59. (define (pi)
  60.   (define (iter i S s16)
  61.     (if (= i 31)
  62.       S
  63.       (iter (+ i 1)(+ S (* s16 (- (/ 4 (+ (* 8 i) 1))
  64.                              (/ 2 (+ (* 8 i) 4))
  65.                              (/ 1 (+ (* 8 i) 5))
  66.                              (/ 1 (+ (* 8 i) 6)))
  67.                    ))
  68.         (/ s16 16))))
  69.   (let ((p (iter 0 0 1)))
  70.     (list #t (round p) (rounding (* (- p (round p)) (expt 10 30))) 30)))
  71.  
  72. (define pi-fixed (pi))
  73.  
  74. (define fixed-pi (pi))
  75.  
  76. (define (fixed// a b)
  77.   (let* (
  78.           (ca (+ (* (cadr a) (expt 10 (cadddr a))) (caddr a)))
  79.           (cb (+ (* (cadr b) (expt 10 (cadddr b))) (caddr b)))
  80.           (xz (quotient ca cb))
  81.           (xo (rounding (/ (* (- ca (* xz cb)) (expt 10 (cadddr a))) cb))))
  82.     (list (equal? (car a) (car b)) xz xo (cadddr a)))                               )
  83.  
  84. (define (fixed+ . args)
  85.   (define (iter S l)
  86.     (if (equal? l '()) S (iter (fixed++ S (car l)) (cdr l))))
  87.   (iter (car args) (cdr args)))
  88.  
  89. (define (fixed- . args)
  90.   (define (iter S l)
  91.     (if (equal? l '())
  92.         S
  93.         (iter (fixed-- S (car l)) (cdr l))))
  94.   (iter (car args) (cdr args)))
  95.  
  96. (define (fixed/ . args)
  97.   (define (iter S l)
  98.     (if (equal? l '()) S (iter (fixed// S (car l)) (cdr l))))
  99.   (iter (car args) (cdr args)))
  100.  
  101. (define (fixed* . args)
  102.   (define (iter S l)
  103.     (if (equal? l '()) S (iter (fixed** S (car l)) (cdr l))))
  104.   (iter (car args) (cdr args)))
  105.  
  106. (define (sphere-volume r)
  107.   (fixed* r r r (fixed/ (list #t 4 0 (cadddr r)) (list #t 3 0 (cadddr r))) fixed-pi))
Advertisement
Add Comment
Please, Sign In to add comment