(-0.0) + (-0.0)
Does someone know any other case in IEEE 754?Bonus question: What happens in subtractions? I only know
(-0.0) - (+0.0)
Is there any other case? (-0.0) + (-0.0)
Does someone know any other case in IEEE 754?Bonus question: What happens in subtractions? I only know
(-0.0) - (+0.0)
Is there any other case?4 comments
Here's an example of -1.0f + 1.0f resulting in -0.0: https://godbolt.org/z/5qvqsdh9P
---
FYI: For more context, I'm trying to send a PR to Chez Scheme (and indirectly to Racket) https://github.com/cisco/ChezScheme/pull/959 to reduce expressions like
where the "fixnums" are small integers and "flonums" are double.It's fine, unless you have the case
because if the length is 0, it get's transformed into 0.0 instead of -0.0There are a few corner cases, in particular because it's possible to have
and I really want to avoid the runtime check of (length L) == 0 if possible.So I took a look, asked there, and now your opinion confirms what I got so far. My C is not very good, so it's nice to have a example of how the rounding directions are used. Luckily Chez Scheme only uses the default rounding and it's probably correct to cut a few corners. I'll take a looks for a few days in case there is some surprise.
An AVX-512 extension has a `vfixupimm` instruction[1] which can adjust special floating point values. You could use this to adjust all zeroes to -0 but leave any non-zeroes untouched. It isn't very obvious how to use though.
You want to set the nybble for categorization ZERO (bits 11..8) to 0x7 (-0) in `fixup`. This would mean you want `fixup` to be equal to `0x00000700`. So usage would be: Which compiles to just 4 instructions, with no branches: It can be extended to operate on 8 int64->double at a time (__m512d) with little extra cost.You could maybe use this optimization where the instruction is available and just stick with a branch version otherwise, or figure out some other way to make it branchless - though I can't think of any other way which would be any faster than a branch.
[1]:https://www.intel.com/content/www/us/en/docs/intrinsics-guid...