動く解答例

もちろん、すべての実数に対しては適用できません。

double f (double d)
{
  long long int x = * (long long int*) & d;
  if (x & 1) {
    x &= 0xfffffffffffffffe;
  } else {
    x = (x | 1) ^ 0x8000000000000000;
  }
  return * (double*) & x;
}

意味はわかりにくいけど、もっとシンプルなプログラム。

double f (double d)
{
  long long int x = * (long long int*) & d;
  x = x ^ 1 ^ (x << 63);
  return * (double*) & x;
}