| |
| Posted by Siarhei Siamashka in reply to kyle | PermalinkReply |
|
Siarhei Siamashka
| On Thursday, 28 October 2021 at 21:23:15 UTC, kyle wrote:
> void main()
{
import std.math : abs, sgn;
alias n_type = short; //or int, long, byte, whatever
assert(n_type.min == abs(n_type.min));
assert(sgn(abs(n_type.min)) == -1);
}
I stumbled into this fun today. I understand why abs yields a negative value here with overflow and no promotion. I just want to know if it should. Should abs ever return a negative number? Thanks.
I think that the best way to deal with this stuff without losing sanity is to introduce a special constant "n_type.nan" for signed integer data types. Then you get "abs(n_type.nan) == n_type.nan", which makes more sense.
All the uses of "n_type.min" in your code can be replaced either with "n_type.nan" or "-n_type.max", depending on the context and your intention. The existing constant "n_type.min" can be deprecated for signed integer types. Compilers and static analysis tools could warn about its use.
|