Whenever I search for the term ‘denormal numbers’ or ‘denormals’, I only find ways how to detect them and round them to zero. Apparently, nobody really likes them, because dealing with them incurs a performance penalty.
And yet, they’re implemented everywhere. Why? If it’s for precision, I’d say you’re gonna need a bigger float, or change the order of your operations such that you avoid really small intermediate values. I find it hard to believe that that little bit of extra precision is really worth the precious clock cycles.
Are there any good reasons why one would still use denormal numbers? And if there are no significant reasons to have denormal numbers, why implement them at all? Only to have IEEE754 compliance?)
In short, because gradual underflow retains some useful mathematical identities (e.g. x-y == 0 means that x == y). Some explanations of why gradual underflow can be useful:
http://grouper.ieee.org/groups/754/faq.html#underflow
http://www.cs.berkeley.edu/~wkahan/ARITH_17U.pdf
And yes, in some cases underflows are encountered due to bad application design, and the proper action is to fix the application. In other cases applications that work correctly with gradual underflow would fail under abrupt underflow.
Furthermore,
In many cases, slow but correct is considered a better default than fast but dangerous.
Since gradual underflow is the default, google finds people complaining about that and wanting to turn it off. If OTOH abrupt underflow were the default, maybe instead you’d see more people complaining about mysterious numerical issues? Numerical programming is hard enough as it is!
Modern hw has reduced the penalty for working with subnormal numbers. See e.g. http://www.agner.org/optimize/blog/read.php?i=142&v=t