osc-insert-float32

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

osc-insert-float32

Mario Lang
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 | Threaded
Open this post in threaded view
|

Re: osc-insert-float32

Andreas Schwab-2
On Dez 17 2019, Mario Lang wrote:

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

For negative zero, check (< (copysign 1.0 x) 0), for NaN use isnan or
(/= x x).

Andreas.

--
Andreas Schwab, [hidden email]
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

Reply | Threaded
Open this post in threaded view
|

Re: osc-insert-float32

Stefan Monnier
In reply to this post by Mario Lang
Mario Lang [2019-12-17 19:04:11] wrote:

> 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?

There's `frexp` to extract the exponent and the mantissa.


        Stefan


Reply | Threaded
Open this post in threaded view
|

Re: osc-insert-float32

Mario Lang
Stefan Monnier <[hidden email]> writes:

> Mario Lang [2019-12-17 19:04:11] wrote:
>
>> 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?
>
> There's `frexp` to extract the exponent and the mantissa.

Oh, I didn't know that either.  However, it looks like `frexp' isn't very
useful when it comes to encoding to binary.  It is a bit too long ago
that I researched the binary32 encoding and wrote the code in question,
but from diving back into the matter, it looks like the mantissa
in binary format is in the 1.0..2.0 range.  frexp gives 0.5..1.0, so the
exponent is also off for what binary needs.  I guess I could just adjust
those values, but I dont really know what I am doing here, so I'll leave
it as it is for now.  Thanks for the food for thought though.

--
CYa,
  ⡍⠁⠗⠊⠕