v83 ← ##.f32 nums                       ⍝ Conversion to 32-bit floats as ⎕DR 83.

From Tomas Gustafsson, this function takes a simple numeric array and returns an
equivalent numeric vector suitable for sending to an  external  process that ex-
pects 32-bit IEEE floating point numbers.

Each number in argument [nums] is  mapped  to  four  ⎕DR-type-83  numbers in the
range ¯128..127.

Ref: https://en.wikipedia.org/wiki/Single-precision_floating-point_format

Geoff Streeter suggests this alternative coding, which uses ⎕NA function MEMCPY:

    f32a←{                              ⍝ Conversion to 32-bit floats as ⎕DR 83.
        bytes←4×≢∊⍵                     ⍝ bytes count
        xx←⍕{2×⎕SIZE'⍵'}⍬               ⍝ '32' or '64'
        libfn←'dyalog',xx,'|MEMCPY'     ⍝ library|function name
        MEMCPY←⊢                        ⍝ local name for ⎕NA'd function
        _←⎕NA libfn,' >I1[] <F4[] P'    ⍝ link to library fn
        MEMCPY bytes(∊⍵)bytes           ⍝ conversion of numeric array
    }

Examples:

    f32 1 2 3                           ⍝ 3 numbers => 3×4 bytes
0 0 ¯128 63 0 0 0 64 0 0 64 64

    f32¨ 1 2 3                          ⍝ each number separately
┌───────────┬────────┬─────────┐
│0 0 ¯128 63│0 0 0 64│0 0 64 64│
└───────────┴────────┴─────────┘

    ⌽∘f32¨ 1 2 3                        ⍝ byte-reversed for Intel machine
┌───────────┬────────┬─────────┐
│63 ¯128 0 0│64 0 0 0│64 64 0 0│
└───────────┴────────┴─────────┘

    hex∘⌽∘f32¨ 1 2 3                    ⍝ hexadecimal format, see →hex←
┌─────────────┬─────────────┬─────────────┐
│┌──┬──┬──┬──┐│┌──┬──┬──┬──┐│┌──┬──┬──┬──┐│
││3f│80│00│00│││40│00│00│00│││40│40│00│00││
│└──┴──┴──┴──┘│└──┴──┴──┴──┘│└──┴──┴──┴──┘│
└─────────────┴─────────────┴─────────────┘

    ∊∘hex∘⌽∘f32¨ 1 2 3                  ⍝ enlisted hex per number
┌────────┬────────┬────────┐
│3f800000│40000000│40400000│
└────────┴────────┴────────┘

    ↑ ∊∘hex∘⌽∘f32¨ 1 2 3                ⍝ hex of 32-bit floating point: 1 2 3
3f800000
40000000
40400000

    x32 ← ↑ ∊∘hex∘⌽∘f32¨                ⍝ 32-bit hex formatter
    x32 1 2 3
3f800000
40000000
40400000

    x32 0 1 ¯2, ÷3                      ⍝ examples from Wikipedia
00000000
3f800000
c0000000
3eaaaaaa

    x64 ← ↑ hexf¨                       ⍝ 64-bit hex formatter, see →hexf←
    x64 1 2 3
3FF0000000000000
4000000000000000
4008000000000000

    cmp ← x32, ' ', x64                 ⍝ 32/64-bit comparison
    cmp 1 to 10                         ⍝ 1..10
3f800000 3FF0000000000000
40000000 4000000000000000
40400000 4008000000000000
40800000 4010000000000000
40a00000 4014000000000000
40c00000 4018000000000000
40e00000 401C000000000000
41000000 4020000000000000
41100000 4022000000000000
41200000 4024000000000000

    cmp 2* 1 to 10                      ⍝ 2 4 8 .. 1024
40000000 4000000000000000
40800000 4010000000000000
41000000 4020000000000000
41800000 4030000000000000
42000000 4040000000000000
42800000 4050000000000000
43000000 4060000000000000
43800000 4070000000000000
44000000 4080000000000000
44800000 4090000000000000

      cmp * 1 to 10                     ⍝ *1, *2, ...
402df854 4005BF0A8B145769
40ec7325 401D8E64B8D4DDAE
41a0af2d 403415E5BF6FB106
425a6481 404B4C902E273A58
431469c4 40628D389970338F
43c9b6e2 407936DC5690C08F
44891442 409122885AAEDDAA
453a4f53 40A749EA7D470C6E
45fd38ab 40BFA7157C470F82
46ac14ee 40D5829DCF950560

See also: hex hexf to

Back to: contents

Back to: Workspaces