unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* osc-insert-float32
@ 2019-12-17 18:04 Mario Lang
  2019-12-17 18:25 ` osc-insert-float32 Andreas Schwab
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Mario Lang @ 2019-12-17 18:04 UTC (permalink / raw)
  To: emacs-devel

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,
  ⡍⠁⠗⠊⠕



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: osc-insert-float32
  2019-12-17 18:04 osc-insert-float32 Mario Lang
@ 2019-12-17 18:25 ` Andreas Schwab
  2019-12-17 19:02 ` osc-insert-float32 Stefan Monnier
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Andreas Schwab @ 2019-12-17 18:25 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

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, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: osc-insert-float32
  2019-12-17 18:04 osc-insert-float32 Mario Lang
  2019-12-17 18:25 ` osc-insert-float32 Andreas Schwab
@ 2019-12-17 19:02 ` Stefan Monnier
  2019-12-17 21:10   ` osc-insert-float32 Mario Lang
  2022-09-30 19:02 ` osc-insert-float32 DIRO
  2022-09-30 19:33 ` osc-insert-float32 Andreas Schwab
  3 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2019-12-17 19:02 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

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




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: osc-insert-float32
  2019-12-17 19:02 ` osc-insert-float32 Stefan Monnier
@ 2019-12-17 21:10   ` Mario Lang
  0 siblings, 0 replies; 6+ messages in thread
From: Mario Lang @ 2019-12-17 21:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> 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,
  ⡍⠁⠗⠊⠕



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: osc-insert-float32
  2019-12-17 18:04 osc-insert-float32 Mario Lang
  2019-12-17 18:25 ` osc-insert-float32 Andreas Schwab
  2019-12-17 19:02 ` osc-insert-float32 Stefan Monnier
@ 2022-09-30 19:02 ` DIRO
  2022-09-30 19:33 ` osc-insert-float32 Andreas Schwab
  3 siblings, 0 replies; 6+ messages in thread
From: DIRO @ 2022-09-30 19:02 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

Le mardi 17 décembre 2019 à 19:04 +0100, Mario Lang a écrit :
> 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?

We could easily add a primitive written in C which uses `memcpy` to
generate the IEEE 32bit encoding of a 32bit or 64bit float.


        Stefan




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: osc-insert-float32
  2019-12-17 18:04 osc-insert-float32 Mario Lang
                   ` (2 preceding siblings ...)
  2022-09-30 19:02 ` osc-insert-float32 DIRO
@ 2022-09-30 19:33 ` Andreas Schwab
  3 siblings, 0 replies; 6+ messages in thread
From: Andreas Schwab @ 2022-09-30 19:33 UTC (permalink / raw)
  To: Mario Lang; +Cc: emacs-devel

On Dez 17 2019, Mario Lang wrote:

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

For the signbit you can use (< (copysign 1.0 value) 0.0), for NaN there
is isnan.  For the exponent you can use frexp.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-09-30 19:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-17 18:04 osc-insert-float32 Mario Lang
2019-12-17 18:25 ` osc-insert-float32 Andreas Schwab
2019-12-17 19:02 ` osc-insert-float32 Stefan Monnier
2019-12-17 21:10   ` osc-insert-float32 Mario Lang
2022-09-30 19:02 ` osc-insert-float32 DIRO
2022-09-30 19:33 ` osc-insert-float32 Andreas Schwab

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).