TLDR: Is there an idiomatic Zig casting convention when going from larger floating point numbers to small integers where values are already guaranteed to have representations in the destination integer type?
I’m working on a problem for discrete value quantization to reduce overall memory and compute for tensor storage and operations. Here’s a primer on the idea: A Gentle Introduction to 8-bit Matrix Multiplication for transformers at scale using transformers, accelerate and bitsandbytes
This is a very common practice and is well defined and quite necessary for modern tensor systems.
More formally, the guarentee comes from the following: s * round(v / ||v||inf) (or the infinity normalized vector multiplied by a scaling constant equal to the max value containable by some integer).
So then, we have a vector where all values are between some range (for an i8, we could choose [-127, 127] ignoring -128 for simplicity).
Now, I need to cast this range to a vector of integers. One possible solution is to do a manual manipulation via the mantissa and exponent and populate the integers that way, but I’m curious if Zig has a more idiomatic solution to this.