3

比较符号的最快方法是double什么?

我知道 adouble有一个“符号位”,但我不确定我在其二进制代表中“寻找它”的方式是否是一个好主意。

除了“可移植性”问题,有人能告诉我 MSVC++ 中这段代码发生了什么吗?

#include <stdio.h>

int main()
{
  double z = 5.0 ;

  __int64 bitSign ;

  __int64 *ptr ;

  ptr = (__int64*)&z ;

  for( __int64 sh = 0 ; sh < 65 ; sh++ )
  {
    bitSign = 1L << sh ; // Weird.  it doesn't do 1.
    printf( "Bit# %d (%llx):  %lld\n",
      sh, bitSign, ( (*ptr) & bitSign) ) ;
  }

}

首先,为什么从第 32 位开始,即使我只移动了一位?

其次,我可以检查 a 的第 64 位double以检查其在 MSVC++ 上的符号吗?

4

4 回答 4

2

至少,必须进行三种比较

  1. 提取符号
  2. 提取 b 的符号
  3. 比较 a 和 b 是否相等

没有办法避免这三件事。

你可以做一个and,你可以做一个less than,这并不重要——你可能——也可以找到一种很酷/聪明/棘手的方式来做另一种方式。但是您仍然需要进行这三个基本操作。也没有必要过度复杂化。如果你正在寻找一些东西坚持在一条线上,你可以这样做:

__int64 mask = 0x8000000000000000; // i think that's the right amount of 0's :-)
if( (x&mask) ^ (y&mask) ) 
  puts("different");
else
  puts("same");

在这里,我正在提取位并对它们进行异或运算。如果位相同,则异或将为 0(假) - 如果位不同,则异或将为 1(真)。用一个很好的评论来解释你在做什么以及为什么,这是一个完全有效的方法。

但是:你给出的“不要使用这个”的例子并不是那么糟糕......它很容易阅读,这是你在代码中可以拥有的最重要的东西之一。优化有两条规则:

  1. 不要这样做。
  2. (仅限专家)不要这样做。

不要为了优化已经非常快的东西而牺牲可读性,并且可能会足够快。:-)

于 2010-05-06T15:40:13.850 回答
0
((((__int64*)(&z))*) & 0x8000000000000000) give you the sign
于 2010-05-06T15:20:51.513 回答
0

double确实有一个符号位(最高有效位),但是找到一个数字的符号比这要复杂一些。您想区分 +0.0 和 -0.0 吗?或者在 +NaN 和 -NaN 之间?

于 2010-05-07T02:37:26.067 回答
0

在 C++11 中,我们给出了如果为std::signbit则返回,否则返回。truefalse

给定两个双精度数,a我们b可以将它们的符号与==or进行比较!=

void classify(double _lhs, double _rhs)
{
    std::cout << _lhs << " and " << _rhs;
    if (std::signbit(_lhs) == std::signbit(_rhs))
        std::cout << " have the same sign\n";
    else
        std::cout << " have different signs\n";
}

现场演示


std::signbit支持doublefloatlong double和所有整数类型。它甚至可以处理NaN值。

于 2017-08-13T00:14:05.693 回答