[Cuis-dev] denormals

Martin McClure martin at hand2mouse.com
Thu Nov 20 11:38:58 PST 2025


Right, for some applications it's OK to approximate.

One of the worst cases is if you're computing a / b. If both a and b are 
normal floats with 52 significant fraction bits, you'll get full 52-bit 
accuracy with only rounding of less than one ULP, but if b is subnormal 
you will get an accuracy of at most the number of significant bits in b. 
And if you flush b to zero, then you divide by zero....

On 11/20/25 11:27 AM, Luciano Notarfrancesco via Cuis-dev wrote:

> Right, I see, depends on the application… I’m not doing that for every 
> float, for pcm audio i just flush to zero anything under -90 dB, and I 
> saw some people add a little dither noise instead, but in other cases 
> it’s not so straight forward… I’m not sure I’m doing it right for 
> filter coefficients, etc, I’ll look more carefully at how other 
> similar projects do it. Thanks!
>
> On Fri, Nov 21, 2025 at 02:06 Martin McClure <martin at hand2mouse.com> 
> wrote:
>
>     Avoiding subnormal floats is desirable, since subnormals have
>     fewer significant bits than normal floats. This should ideally be
>     done by designing the application to do its computations so that
>     subnormals are never created. Forcing subnormals to go to zero is
>     the wrong direction entirely -- that is saying "I've lost some
>     bits of accuracy, so now let's throw away /all/ the bits and have
>     /no/ accuracy."
>
>     A faster path to a wrong answer is seldom, if ever, a good trade.
>
>     Regards,
>
>     -Martin
>
>     On 11/20/25 10:00 AM, Luciano Notarfrancesco via Cuis-dev wrote:
>>     It seems to me that when working with floats in Cuis we should
>>     try to avoid denormals (or subnormals, i.e. floats that are very
>>     close to 0 but not 0). They used to be slower than other floats
>>     in old CPUs, and they are not so much of a problem anymore in
>>     modern CPUs, but I think they would still be problematic in Cuis
>>     because they turn into BoxedFloat64 (instead of SmallFloat64).
>>     What’s the best way to handle them? For the time being I
>>     implemented BoxedFloat64>>undenormalized as:
>>         self isDenormalized ifTrue: [^ 0.0]
>>     and in Float just returns self. The method isDenormalized comes
>>     in the base image, but it’s not super fast. Is there a better way
>>     to do it?
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20251120/ac5fa75b/attachment.htm>


More information about the Cuis-dev mailing list