emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

osc-insert-float32


From: Mario Lang
Subject: osc-insert-float32
Date: Tue, 17 Dec 2019 19:04:11 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Hi.

14 years ago, I wrote this beast to be able to send IEEE floating point
values over the network (Open Sound Control).  Reading it today, I am
actually surprised I was driven enough to get this working.  I am
wondering, is there a better way to achieve this today?
Maybe something in Emacs itself I missed?

If no, is there a better way to test for negative zero and 0.0e+NaN?

;; From elpa package osc.el
(defun osc-insert-float32 (value)
  (let (s (e 0) f)
    (cond
     ((string= (format "%f" value) (format "%f" -0.0))
      (setq s 1 f 0))
     ((string= (format "%f" value) (format "%f" 0.0))
      (setq s 0 f 0))
     ((= value 1.0e+INF)
      (setq s 0 e 255 f (1- (expt 2 23))))
     ((= value -1.0e+INF)
      (setq s 1 e 255 f (1- (expt 2 23))))
     ((string= (format "%f" value) (format "%f" 0.0e+NaN))
      (setq s 0 e 255 f 1))
     (t
      (setq s (if (>= value 0.0)
                  (progn (setq f value) 0)
                (setq f (* -1 value)) 1))
      (while (>= (* f (expt 2.0 e)) 2.0) (setq e (1- e)))
      (if (= e 0) (while (< (* f (expt 2.0 e)) 1.0) (setq e (1+ e))))
      (setq f (round (* (1- (* f (expt 2.0 e))) (expt 2 23)))
            e (+ (* -1 e) 127))))
    (insert (+ (lsh s 7) (lsh (logand e #XFE) -1))
            (+ (lsh (logand e #X01) 7) (lsh (logand f #X7F0000) -16))
            (lsh (logand f #XFF00) -8)
            (logand f #XFF))))

-- 
CYa,
  ⡍⠁⠗⠊⠕



reply via email to

[Prev in Thread] Current Thread [Next in Thread]