Skip to content

Negative number of fractional bits #311

Open

Description

@PatrickHaecker

With Fixed we can reduce the number of fractional bits to trade range for precision:

julia> Fixed{Int8, 2} .|> (typemin, typemax, eps)
(-32.0Q5f2, 31.75Q5f2, 0.25Q5f2)

julia> Fixed{Int8, 1} .|> (typemin, typemax, eps)
(-64.0Q6f1, 63.5Q6f1, 0.5Q6f1)

julia> Fixed{Int8, 0} .|> (typemin, typemax, eps)
(-128.0Q7f0, 127.0Q7f0, 1.0Q7f0)

However, currently support stops here. It would be useful to have a

julia> Fixed{Int8, -1} .|> (typemin, typemax, eps)
(-256.0Q8f-1, 254.0Q8f-1, 2.0Q8f-1)

and all the other types with a negative number of fractional bits available, when range demands are high, precision demands are low and you want to distribute the available values uniformly in the range or want to use integer arithmetic (so floating points are not an option).

This would not really match the packet's name as they are not really fixed-point numbers (with the "point" being outside of the represented bits). On the other hand, an implementation of these numbers (scaled integers) seems to be completely identical in representing the type (struct) and should cover both positive and negative numbers of fractional bits if some methods are generalized or their domain restrictions are relaxed.

So what would these scaled integers be? Would they use a slightly generalized version of Fixed, would they be a ScaledInteger within the FixedPointNumbers.jl package or would they be the topic of a ScaledIntegers.jl package?

Activity

  1. mkitti commented on Nov 25, 2025

    @mkitti

    That's pretty neat. I'm leaning towards a ScaledIntegers.jl package, but it seems possible to implement here.

    My main preference for ScaledIntegers.jl is that it seems more intuitive to the user than what a negative bits might mean.

  2. PatrickHaecker commented on Nov 27, 2025

    @PatrickHaecker
    CollaboratorAuthor

    My main preference for ScaledIntegers.jl is that it seems more intuitive to the user than what a negative bits might mean.

    Indeed, it would. However, we most likely want to have (also) a type which allows both positive and negative scaling. So I guess the question is whether a negatively scaled integer is more intuitive than a negative number of fractional bits. It probably is, but I guess at least in the beginning both take a bit of time to use them intuitively.

    It's also interesting, how much this is a matter of perspective. One valid view of floating point numbers is that all the integers in the mantissa are scaled to be between 0 and 1 (or between 1 and 2) and these then again are scaled by the power (resulting from the exponent).
    Here, it does not matter whether the power scales positively or negatively, we always call it "floating point" even if there is no "point" inside of the representation (as in Float32(4)). In that sense, it would be totally valid if not even advisable to use the name fixed point value for negative scaling, too.

  3. kimikage commented on Sep 13, 2026

    @kimikage
    Collaborator

    FixedPointNumbers.jl serves as one of the cornerstones of the Julia ecosystem, including ColorTypes among others.
    This is just my personal opinion, but I believe this package should prioritize working well in common use cases over comprehensive coverage.
    By limiting the valid range of f, it is sometimes possible to eliminate edge cases that cause bugs or enable better optimization.

    I think it would be beneficial to add a couple of abstract types by v1.0 for the other variant packages and their downstream packages.

  4. nhz2 commented on Sep 22, 2026

    @nhz2

    I think we need the overflow bug fix in JuliaLang/julia#63283 for this to work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions