如何根据另一个设置值的符号

时间:2015-03-13 05:00:43

标签: php algorithm logic negative-number

我正在使用一个PHP脚本,它有一个计算,给我一个数字。计算本身是一个黑盒子,我使用一个函数来访问它,它给了我一个数字。

所以:

$num = doCalc($some_arguments); //$num now has a non-zero numeric value

现在,我希望$num to be positive or negative的符号基于另一个数字的符号。我知道我可以用“if-else”做到这一点,但是我试图检查没有逻辑分支的最佳方法。

所以我正在做的是将$ anotherNum的符号应用到$ num:

$anotherNum = -10; //for example...
$num = doCalc($some_arguments); //lets assume $num is 100...
$num = abs($num) * ($anotherNum/abs($anotherNum))

我不确定这是否是正确的方法,或者PHP是否具有可以轻松完成的功能。任何指针,任何人?

感谢。

1 个答案:

答案 0 :(得分:1)

你可以通过多种方式做到这一点,你的方法可以改变总和值的精确度(在浮点数上),因为乘法和除法......这里有更多的选项让a成为你的numb

anothernum
  1. 如果乘以不同极性的数字,结果为负

    if ((a*b)<0.0) a=-a;
    
  2. 避免计算

    if (((a<0.0)&&(b>0.0))||((a>0.0)&&(b<0.0))) a=-a;
    
  3. 签名位提取

    • sign通常是大多数语言/平台中booth整数和flaoting值的MSB,所以在这种情况下
    • 用于32位浮点值:

      unsigned int sa=(unsigned int*)(&a)[0]>>31;
      unsigned int sb=(unsigned int*)(&b)[0]>>31;
      if (sa!=sb) a=-a;
      
    • 表示32位整数值:

      if ((a&0x80000000)!=(b&0x80000000)) a=-a;
      
    • 如果您使用bithift或bit mask无关紧要......
    • 对于64位值使用64位变量并将位移更改为63
    • 或向掩码十六进制数字
    • 添加另外8个零
  4. [注释]

    • 现在您需要在b==0 ...
    • 时添加案例

    [edit1] no if if / else for floats

    float a,b; // these are you numbers
    unsigned int *pa=(unsigned int*)(&a);
    unsigned int *pb=(unsigned int*)(&b);
    *pa=((*pa)&0x7FFFFFFF)|((*pb)&0x80000000);
    
    • 然后只需将符号位从a复制到b
    • pa,pb只是指针处理a,b作为位访问的整数类型
    • 上半部分清除
    • 中的符号位
    • 第二个从b
    • 复制符号位