I'd be a bit careful about assuming floating point - will someone want to pack/unpack BCD? Or PDP-10 Gfloat (well, OK that's a floating format)? Or...
I don't like Math:: - it implies that it does arithmetic (or calculus, or statistics, or - more than a conversion). And I'd rather not have a format name encoded in the module that the user calls. How about Number::Encode->new("name") & Number::Decode->new("name")? Let "name" get to a subclass, so other formats can be supported just by adding a module - e.g. "Number:Encode::BCD" could be require'd if *->new('bcd') called. Obviously, you'd implement IEEE754, Intel80, and whatever else... Define the API for the subclasses - encode(),decode(), perhaps some info functions (e.g. a printable name, perhaps exponent and fraction range/#bits, ...) Then someone who wants Number::Decode::VAX_DFLOAT just calls Number::Decode->new('vax_dfloat') - after writing it. Some of these can get interesting if you want to decode and actually do math - presumably you'll support Math::BigXxx / bignum? (binary128, VAX H_Floating are, IIRC about 36 decimal digits) And some program that reads archived data can have a description language that is simply "name" "format" "byte offset" "length", and not worry about what module handles what format. In fact, such a program might appreciate the trivial modules Number::Encode::INTEGER32 (and perhaps the less obvious Number::Encode::INTEGER32_ONESCOMPLEMENT)... I suspect there are better names for the format, but the idea is to export a simple wrapper so the next format can be added by anyone, and the callers don't have to know too much. FWIW. On 03-Jun-21 06:23, Peter John Acklam wrote: > I also plan to implement the 80 bit "extended precision" format, which > is not IEEE 754 compatible. Perhaps the best and simplest is > Number::Pack and Number::Unpack? > > Peter > > tor. 3. jun. 2021 kl. 11:43 skrev Peter John Acklam <pjack...@gmail.com>: >> Hi >> >> I am working on two modules for encoding and decoding numbers as per >> IEEE754. The pack() function can encode and decode the formats binary32 >> (single precision) and binary64 (double precision). My module can also >> handle binary128 (quad precision), binary16 (half precision), bfloat16 (not >> an IEEE754 format, but it follows the IEEE754 pattern), and a few other >> formats. >> >> My question is about the namespace. Is Math::IEEE754::Encoder (and >> ...::Decoder) OK? Or is Number::IEEE754::Encoder better? Or any other? >> >> Here is an example showing how I use it: >> >> my $encoder = Math::IEEE754::Encoder -> new("binary16"); >> my $bytes = $encoder -> (3.14159265358979); # = "\x42\x48" >> >> my $decoder = Math::IEEE754::Decoder -> new("binary16"); >> my $number = $decoder -> ($bytes); # = 3.140625 >> >> The reason for returning an anonymous function rather than implementing the >> function directly, is speed. There are some constants involved, and I don't >> want to compute them for each function call. >> >> Cheers, >> Peter John Acklam (PJACKLAM)
OpenPGP_signature
Description: OpenPGP digital signature