Fixes https://github.com/dlozeve/bqn-npy/issues/1. The spec says that •bit._cast should support 32-bit uints [1], but CBQN does not [2]. To get around this, we just use signed integers, which works for numbers smaller than 2^31. Above that, it will wrap around and (probably) fail, but CBQN does not support them anyway (except by converting them to doubles). From Marshall: > All of the provided functions at this time are identical on i32 and > u32, because they work (mod 2^32) and the only difference between > those formats is to add or subtract 2^32 from numbers outside the > range [0,2^31). > If you want to run on u32s stored directly as numbers in BQN (they > won't fit in i32 and will be stored as double!) you can •bit._cast > those into a signed format at the beginning and then back out at the > end. [1] https://mlochbaum.github.io/BQN/spec/system.html#bitwise-operations [2] https://matrix.to/#/!EjsgbQQNuTfHXQoiax:matrix.org/$PL2AYNlLQuYhPftdt7yw7rW9heiVEEeATte2zOt2BYk
30 lines
773 B
BQN
30 lines
773 B
BQN
⟨SaveNpy,LoadNpy⟩←•Import"npy.bqn"
|
||
|
||
floatArr←2‿3•rand.Range 0
|
||
intArr←(2⋆31)-˜2‿3•rand.Range 2⋆32
|
||
uintArr←2‿3•rand.Range 2⋆31
|
||
|
||
"test_float.npy"SaveNpy floatArr
|
||
"test_int.npy"SaveNpy intArr
|
||
"test_uint.npy"SaveNpy uintArr
|
||
|
||
! floatArr≡LoadNpy"test_float.npy"
|
||
! intArr≡LoadNpy"test_int.npy"
|
||
! uintArr≡LoadNpy"test_uint.npy"
|
||
|
||
# Supported dtypes
|
||
ref←2‿3‿4⥊0
|
||
! ref≡LoadNpy"test<f8.npy"
|
||
! ref≡LoadNpy"test<i4.npy"
|
||
! ref≡LoadNpy"test<u4.npy"
|
||
# Unsupported dtypes, should raise an error
|
||
! LoadNpy⎊1"test<f4.npy"
|
||
! LoadNpy⎊1"test<i8.npy"
|
||
! LoadNpy⎊1"test<u8.npy"
|
||
! LoadNpy⎊1"test>f4.npy"
|
||
! LoadNpy⎊1"test>f8.npy"
|
||
! LoadNpy⎊1"test>i4.npy"
|
||
! LoadNpy⎊1"test>i8.npy"
|
||
! LoadNpy⎊1"test>u4.npy"
|
||
! LoadNpy⎊1"test>u8.npy"
|
||
|