Boost logo

Boost :

From: Matt Borland (matt_at_[hidden])
Date: 2025-01-15 19:55:47


ick comments from me as well:
>

> "The final number constructed is in the form (sign || coeff < 0 ? -1 : 1) x abs(coeff) x 10^exp."
>

> This doesn't make much sense formatting-wise; the
> "(sign || coeff < 0 ? -1 : 1) x abs(coeff) x 10^exp" part should
> be formatted differently and not mix code and ad-hoc 'x'
> multiplication notations.
>

See discussion here: https://github.com/cppalliance/decimal/pull/785. I previously had only coeff x 10^exp.

> namespace boost {
> namespace decimal {
>

> // Paragraph numbers are from ISO/IEC DTR 24733
>

> // 3.2.2.1 construct/copy/destroy
> constexpr decimal32() noexcept = default;
>

> This doesn't compile. "class decimal32 {" is missing.
>

It was previously described here: https://cppalliance.org/decimal/decimal.html#generic_decimal_ so I did not duplicate anything from that block.

> The default "decimal32" name is occupied by the storage-optimized
> form and not by the operation-optimized form. I don't think this is
> the right decision. The storage-optimized form should only exist in
> memory, and everything else should use the operation-optimized
> form.
>

> E.g. if we have (illustrative)
>

> decimal32 f( decimal32 a, decimal32 b )
> {
> return a+b;
> }
>

> decimal32 g( decimal32 a, decimal32 b )
> {
> return a*b;
> }
>

> int main()
> {
> decimal32 a, b, c, d, e;
> e = f( g(a, b), g(c, d) );
> }
>

> this currently would do a few unnecessary packs and unpacks.
>

> But if f/g take and return the operation-optimized form, these
> unnecessary pack+unpack operations are avoided.
>

> That is, if "decimal32" is the operation-optimized form, and we
> have e.g. "decimal32bid" for the BID encoded form, main would
> be
>

> int main()
> {
> decimal32bid a, b, c, d, e;
> e = f( g(a, b), f(c, d) );
> }
>

> So the actual storage ("at rest") is still the same, but operations
> are more efficient.
>

> Note that in this case decimal32bid has no operations, only
> conversions from and to decimal32. The actual arithmetic is
> always performed over the operation-optimized form.
>

The name "decimal32" is occupied by the IEEE-754 compliant type. The naming scheme matches published standards and existing practice such as uint32_t vs uint_fast32_t. There's a clear statement of intent using the latter. I don't think people should pick decimal32 over decimal32_fast in the general case, but I also think it would be a bad idea to diverge from IEEE in our naming scheme.

Matt






Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk