<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Racket%2FPosits</id>
	<title>Racket/Posits - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Racket%2FPosits"/>
	<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Posits&amp;action=history"/>
	<updated>2026-04-06T19:19:47Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Posits&amp;diff=1833&amp;oldid=prev</id>
		<title>Anders: Skapade sidan med &#039;&lt;pre&gt; #lang racket  ;;;;; ;; En enkel implementation av Posists eller Unum typ III ;; i Racket för skojs skull och för att lära sig mer ;; ;; Täpp-Anders Sikvall anders@sikvall.se 2026-04-04 ;; ;; Posit representeras som ett heltal (bitmönster, 0 till 2^n-1). ;; Parametrar: n = totalt antal bits, es = antal exponent-bits (t.ex. n=16, es=1 för posit16). ;; Innehåller: ;;  * Konvertering till/från generiska tal (number-&gt;posit och posit-&gt;number) ;;  * Addition, subt...&#039;</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Posits&amp;diff=1833&amp;oldid=prev"/>
		<updated>2026-04-05T13:01:42Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;&amp;lt;pre&amp;gt; #lang racket  ;;;;; ;; En enkel implementation av Posists eller Unum typ III ;; i Racket för skojs skull och för att lära sig mer ;; ;; Täpp-Anders Sikvall anders@sikvall.se 2026-04-04 ;; ;; Posit representeras som ett heltal (bitmönster, 0 till 2^n-1). ;; Parametrar: n = totalt antal bits, es = antal exponent-bits (t.ex. n=16, es=1 för posit16). ;; Innehåller: ;;  * Konvertering till/från generiska tal (number-&amp;gt;posit och posit-&amp;gt;number) ;;  * Addition, subt...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; En enkel implementation av Posists eller Unum typ III&lt;br /&gt;
;; i Racket för skojs skull och för att lära sig mer&lt;br /&gt;
;;&lt;br /&gt;
;; Täpp-Anders Sikvall anders@sikvall.se 2026-04-04&lt;br /&gt;
;;&lt;br /&gt;
;; Posit representeras som ett heltal (bitmönster, 0 till 2^n-1).&lt;br /&gt;
;; Parametrar: n = totalt antal bits, es = antal exponent-bits (t.ex. n=16, es=1 för posit16).&lt;br /&gt;
;; Innehåller:&lt;br /&gt;
;;  * Konvertering till/från generiska tal (number-&amp;gt;posit och posit-&amp;gt;number)&lt;br /&gt;
;;  * Addition, subtraktion, multiplikation och division av posits&lt;br /&gt;
;;&lt;br /&gt;
;; Aritmetiken är implementerad via konvertering till reellt tal + operation + tillbaka till posit&lt;br /&gt;
;; (enkel approach som bevarar tapered precision via rounding vid varje steg).&lt;br /&gt;
;; Full bit-exakt aritmetik (alignera regime/exponent etc.) är mer komplex och lämnas som utökning.&lt;br /&gt;
;; Algoritmen för number-&amp;gt;posit är översatt direkt från Gustafsons x2p i &amp;quot;Posits4.pdf&amp;quot;.&lt;br /&gt;
;; posit-&amp;gt;number använder full fält-extraktion (regime, exponent, fraction).&lt;br /&gt;
&lt;br /&gt;
(define (number-&amp;gt;posit x n es)&lt;br /&gt;
  ;; x2p-algoritmen från Gustafson (översatt till Racket)&lt;br /&gt;
  ;; Returnerar posit-bitmönster som heltal.&lt;br /&gt;
  (cond&lt;br /&gt;
    [(= x 0) 0]&lt;br /&gt;
    [(infinite? x) (arithmetic-shift 1 (- n 1))]&lt;br /&gt;
    [else&lt;br /&gt;
     (let* ([nbits n]&lt;br /&gt;
            [npat (expt 2 nbits)]&lt;br /&gt;
            [useed (expt 2 (expt 2 es))]&lt;br /&gt;
            [y (abs x)]&lt;br /&gt;
            [p 0]&lt;br /&gt;
            [i 0]&lt;br /&gt;
            [e-val (- (expt 2 es) 1)])&lt;br /&gt;
       ;; Northeast/southeast quadrant (regime-byggnad)&lt;br /&gt;
       (if (&amp;gt;= y 1)&lt;br /&gt;
           (begin&lt;br /&gt;
             (set! p 1)&lt;br /&gt;
             (set! i 2)&lt;br /&gt;
             (let loop-regime ()&lt;br /&gt;
               (when (and (&amp;gt;= y useed) (&amp;lt; i nbits))&lt;br /&gt;
                 (set! p (+ (* 2 p) 1))&lt;br /&gt;
                 (set! y (/ y useed))&lt;br /&gt;
                 (set! i (add1 i))&lt;br /&gt;
                 (loop-regime)))&lt;br /&gt;
             (set! p (* 2 p))&lt;br /&gt;
             (set! i (add1 i)))&lt;br /&gt;
           (begin&lt;br /&gt;
             (set! p 0)&lt;br /&gt;
             (set! i 1)&lt;br /&gt;
             (let loop-regime ()&lt;br /&gt;
               (when (and (&amp;lt; y 1) (&amp;lt;= i nbits))&lt;br /&gt;
                 (set! y (* y useed))&lt;br /&gt;
                 (set! i (add1 i))&lt;br /&gt;
                 (loop-regime)))&lt;br /&gt;
             (if (&amp;gt;= i nbits)&lt;br /&gt;
                 (begin&lt;br /&gt;
                   (set! p 2)&lt;br /&gt;
                   (set! i (add1 nbits)))&lt;br /&gt;
                 (begin&lt;br /&gt;
                   (set! p 1)&lt;br /&gt;
                   (set! i (add1 i))))))&lt;br /&gt;
       ;; Exponent-extraktion&lt;br /&gt;
       (let loop-exp ()&lt;br /&gt;
         (when (and (&amp;gt; e-val 0.5) (&amp;lt;= i nbits))&lt;br /&gt;
           (set! p (* 2 p))&lt;br /&gt;
           (when (&amp;gt;= y (expt 2 e-val))&lt;br /&gt;
             (set! y (/ y (expt 2 e-val)))&lt;br /&gt;
             (set! p (add1 p)))&lt;br /&gt;
           (set! e-val (/ e-val 2))&lt;br /&gt;
           (set! i (add1 i))&lt;br /&gt;
           (loop-exp)))&lt;br /&gt;
       (set! y (- y 1))&lt;br /&gt;
       ;; Fraction-bits&lt;br /&gt;
       (let loop-frac ()&lt;br /&gt;
         (when (and (&amp;gt; y 0) (&amp;lt;= i nbits))&lt;br /&gt;
           (set! y (* 2 y))&lt;br /&gt;
           (set! p (+ (* 2 p) (floor y)))&lt;br /&gt;
           (set! y (- y (floor y)))&lt;br /&gt;
           (set! i (add1 i))&lt;br /&gt;
           (loop-frac)))&lt;br /&gt;
       ;; Skift och rounding (nearest, tie to even)&lt;br /&gt;
       (set! p (* p (expt 2 (- (+ nbits 1) i))))&lt;br /&gt;
       (set! i (add1 i))&lt;br /&gt;
       (let* ([round-bit (bitwise-and p 1)])&lt;br /&gt;
         (set! p (floor (/ p 2)))&lt;br /&gt;
         (set! p (cond&lt;br /&gt;
                   [(= round-bit 0) p]&lt;br /&gt;
                   [(= y 0) (+ p (bitwise-and p 1))]  ;; tie to even&lt;br /&gt;
                   [else (add1 p)])))&lt;br /&gt;
       ;; Negativt tal: 2&amp;#039;s complement (npat - p)&lt;br /&gt;
       (set! p (modulo (if (&amp;lt; x 0) (- npat p) p) npat))&lt;br /&gt;
       p)]))&lt;br /&gt;
&lt;br /&gt;
(define (posit-&amp;gt;number p n es)&lt;br /&gt;
  ;; Full decode enligt Gustafson/Unum Type III&lt;br /&gt;
  ;; Returnerar exakt reellt tal (flonum för enkelhet, men kan utökas till rational).&lt;br /&gt;
  (cond&lt;br /&gt;
    [(= p 0) 0]&lt;br /&gt;
    [(= p (arithmetic-shift 1 (- n 1))) +inf.0]  ;; NaR / ∞&lt;br /&gt;
    [else&lt;br /&gt;
     (let* ([sign (if (zero? (bitwise-and p (arithmetic-shift 1 (- n 1)))) 1 -1)]&lt;br /&gt;
            [abs-p (if (= sign 1)&lt;br /&gt;
                       p&lt;br /&gt;
                       (bitwise-and (+ (bitwise-not p) 1) (- (expt 2 n) 1)))]&lt;br /&gt;
            [useed (expt 2 (expt 2 es))])&lt;br /&gt;
       ;; Extrahera regime (runlength m av identiska bits)&lt;br /&gt;
       (let*-values ([(r m) (let ([first-r (bitwise-and (arithmetic-shift abs-p (- (- n 2))) 1)])&lt;br /&gt;
                              (let loop ([pos (- n 2)]&lt;br /&gt;
                                         [m 0])&lt;br /&gt;
                                (if (or (&amp;lt; pos -1) (&amp;gt; m n))&lt;br /&gt;
                                    (values first-r m)&lt;br /&gt;
                                    (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                                      (if (= bit first-r)&lt;br /&gt;
                                          (loop (sub1 pos) (add1 m))&lt;br /&gt;
                                          (values first-r m))))))])&lt;br /&gt;
         (let* ([k (if (= r 0) (- m) (- m 1))]&lt;br /&gt;
                ;; Regime-field tar m + 1 bits (run + terminator)&lt;br /&gt;
                [regime-bits-used (+ m 1)]&lt;br /&gt;
                [exp-start-pos (- (- n 2) regime-bits-used)]  ;; första exp-bit (MSB)&lt;br /&gt;
                ;; Ta upp till es exp-bits (pad low bits med 0 om färre)&lt;br /&gt;
                [exp-bits (if (&amp;lt; exp-start-pos 0)&lt;br /&gt;
                              0&lt;br /&gt;
                              (let loop ([pos exp-start-pos]&lt;br /&gt;
                                         [bits-left es]&lt;br /&gt;
                                         [e-acc 0])&lt;br /&gt;
                                (if (or (&amp;lt;= bits-left 0) (&amp;lt; pos -1))&lt;br /&gt;
                                    e-acc&lt;br /&gt;
                                    (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                                      (loop (sub1 pos)&lt;br /&gt;
                                            (sub1 bits-left)&lt;br /&gt;
                                            (+ (* e-acc 2) bit))))))]&lt;br /&gt;
                [exp-used (min es (max 0 (+ (- n 1) exp-start-pos)))]  ;; tillgängliga bits&lt;br /&gt;
                [f-start-pos (- exp-start-pos exp-used)]&lt;br /&gt;
                ;; Fraction (remaining bits, hidden 1.)&lt;br /&gt;
                [f (if (&amp;lt; f-start-pos 0)&lt;br /&gt;
                       0&lt;br /&gt;
                       (let loop ([pos f-start-pos]&lt;br /&gt;
                                  [f-acc 0]&lt;br /&gt;
                                  [fsize 0])&lt;br /&gt;
                         (if (&amp;lt; pos -1)&lt;br /&gt;
                             f-acc&lt;br /&gt;
                             (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                               (loop (sub1 pos)&lt;br /&gt;
                                     (+ (* f-acc 2) bit)&lt;br /&gt;
                                     (add1 fsize))))))]&lt;br /&gt;
                [fsize (max 0 (- n 1 regime-bits-used exp-used))]  ;; antal fraction-bits&lt;br /&gt;
                [significand (+ 1 (/ f (expt 2 fsize)))])&lt;br /&gt;
           (* sign (expt useed k) (expt 2 exp-bits) significand))))]))&lt;br /&gt;
&lt;br /&gt;
;; Aritmetik (enkel via realtal + rounding till posit)&lt;br /&gt;
(define (posit+ p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (+ (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit- p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (- (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit* p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (* (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit/ p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (/ (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
;; Exempel på användning (kommentera bort eller kör i REPL):&lt;br /&gt;
;; (define n 16)&lt;br /&gt;
;; (define es 1)&lt;br /&gt;
;; (define a (number-&amp;gt;posit 3.14 n es))   ;; -&amp;gt; posit för 3.14&lt;br /&gt;
;; (define b (number-&amp;gt;posit 2.0 n es))&lt;br /&gt;
;; (posit+ a b n es)                      ;; addition&lt;br /&gt;
;; (posit-&amp;gt;number a n es)                 ;; tillbaka till tal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
</feed>