visual-c++ - 比较两个 double 的符号

标签 visual-c++ floating-point double sign

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

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

除了“可移植性”问题,有人能告诉我这段代码在 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 位开始,即使我只移动了一位?

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

最佳答案

至少,必须进行三种比较

  1. 提取a的符号
  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. (仅限专家)先不要这样做。

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

关于visual-c++ - 比较两个 double 的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2782168/

相关文章:

c++ - header 中包含 "std::cout"的非静态成员引用

ios - 尝试将字符串转换为 double 时出错

c++ - 有没有可靠的方法在 double 中传递微秒时间?

.net - .NET 中小数、浮点和 double 之间的区别?

python - 在Python 3中进行精确的浮点除法

java - 如何将 double / float 舍入为二进制精度?

c++ - 定义为整数但编译器认为其中一个是 double ?

c++ - 从 boost::archive::text_oarchive_impl 和 boost::archive::text_iarchive_impl 派生自定义存档类

c++ - VC++中的矩阵形式

c++ - 关于数据对齐的困惑