This article is more than 1 year old
Not Half bad: Microsoft back to 16 bits with new storage-saving type in .NET 5
For when precision isn't so important
Microsoft shone light today on a new type, Half, lurking within the depths of .NET 5 Preview 7, aimed at adding another IEEE 754 format as well as saving a bit of storage space.
float (equivalent to
double (equivalent to
binary64) have long been familiar to users of the framework,
binary16 has been missing in action (along with others, such as
Those battling with floating point numbers and happy to swap precision for storage need fret no longer as
Half has taken a bow in the preview framework.
An unusual move for a company more normally associated with ballooning storage requirements,
Half requires a mere 16 bits to store a binary floating-point number. "With half the number of bits as float, a Half number can represent values in the range ±65504," explained the post.
The 16 bits are split into a sign bit, five exponent bits and 10 significand bits (although the team said that the total precision was actually 11 bits). "The format," the team added, "is assumed to have an implicit leading bit of value 1." The smallest positive non-zero
Half number is therefore
0.000000059604645 and the largest
Half values can be represented as
double numbers without losing precision. Obviously, going to the 16 bits of
Half from something with more precision could well see some losses. Being intended for interchange purposes,
Half also lacks the arithmetic operators of
double. Only parsing, formatting and comparison are in .NET 5.0 at present, although "future versions will consider adding arithmetic operators directly on
Nvidia: Eight bits ought to be enough for anybody ... doing AIREAD MORE
The gang reckons that the new type will save on storage space where greater precision is not required and will see use in the machine learning sphere, among others. It also enjoys hardware support in both GPU and CPU worlds.
Sadly, there is no love for other floating point types, such as
binary128. The author of the post, Prashanth Govindarajan, noted that
Half was all the team could squeeze in this time around (and it could prove handy for the ML.NET project). Govindarajan also speculated that x86 and ARM processors would experience "accelerated... computation performance" once more intrinsics are supported in .NET.
Microsoft engineer Tanner Gooding added that unlike
binary128 did not enjoy so much hardware support and was "almost entirely software driven".
Gooding went on to suggest that
binary128 was also a little more niche, adding: "I would speculate those that want a Binary128 would also want a BigFloat type, so they can also have Binary256 or Binary512."
Those pesky, demanding users that want such things can pop over to the GitHub repo for the project and make their feelings known. Gooding himself opened an issue along those lines in 2018. ®