From 3b797f0215db666371cd03dde685d76c14af93f6 Mon Sep 17 00:00:00 2001 From: Dmitriy Gorshenin Date: Thu, 12 May 2022 18:59:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5:=20=D0=9E=D0=B1=D1=89=D0=B8=D0=B9=20=D1=81=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B0=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Верхолин Игорь/README.md | 16 +++++++ Верхолин Игорь/mul.rkt | 61 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 Верхолин Игорь/README.md create mode 100644 Верхолин Игорь/mul.rkt diff --git a/Верхолин Игорь/README.md b/Верхолин Игорь/README.md new file mode 100644 index 0000000..8b03919 --- /dev/null +++ b/Верхолин Игорь/README.md @@ -0,0 +1,16 @@ +# Умножение: общий случай +## Ссылка на видеоразбор +## Код из книги + let real_mul x y n = + let n2 = n + 2 in + let r = n2 / 2 in + let s = n2 − r in + let xr = x(r) + and ys = y (s) in + let p = log2 xr + and q = log 2 ys in + if p = 0 & q = 0 then Int 0 else + let k = q + r + 1 + and l = p + s + 1 + and m = p + q + 4 in + (x(k) ∗/ y(l)) ndiv ( Int 2 ∗∗/ Int m) ;; diff --git a/Верхолин Игорь/mul.rkt b/Верхолин Игорь/mul.rkt new file mode 100644 index 0000000..8550929 --- /dev/null +++ b/Верхолин Игорь/mul.rkt @@ -0,0 +1,61 @@ +#lang racket +(require string-util) + +(define (acc x n) + (* (string->number x) (expt 2 n)) + ) + + +(define (n_div x y) + (round (/ x y)) +) + +(define (log2 x) + (define (rec x y) + (if (< x 1) + ;then + y + ;else + (rec (quotient (floor x) 2) (+ y 1)) + ) + ) + (rec (- x 1) 0) +) + +(define (rround num prec) + (string->number (real->decimal-string num prec)) + ) + + +(define (rmul x y n) + (define (sub_mul) + (define k (+ q r 1)) + (define l (+ p s 1)) + (define m (+ p q n 4)) + (rround (/ (* (acc y l) (acc x k)) (expt 2 m)) n) + ) + + (define n2 (+ n 2)) + (define r (quotient n2 2)) + (writeln r) + (define s (- n2 r)) + (writeln s) + (define xr (acc x r)) + (define ys (acc y s)) + (define p (log2 xr)) + (writeln p) + (define q (log2 ys)) + (writeln q) + (if (and (equal? p 0) (equal? q 0)) + ;then + 0 + ;else + (sub_mul) + ) +) + +(rmul "1.0003" "1.0002" 3) +;(el "35.34" 3) +;(acc "4.5" 3) + +