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

标签 php algorithm logic negative-number

我正在使用一个 php 脚本,它有一个计算,可以给我一个数字。计算本身是一个黑盒子,我使用一个返回数字的函数访问它。

所以:

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

现在,我希望根据另一个数字的符号,$num 的符号是正数还是负数。我知道我可以用“if-else”来做到这一点,但我正在尝试检查没有逻辑分支的最佳方法是什么。

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

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

我不确定这是否是正确的方法,或者 PHP 是否具有可以轻松完成此操作的函数。任何指示,任何人?

谢谢。

最佳答案

您可以通过多种方式做到这一点,您的方法可以改变总和值精度(在 float 上),因为乘法和除法...这里有更多选项让 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. 符号位提取

    • 在大多数语言/平台中,符号通常是 booth 整数和 float 的 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;
      
    • 位移位或位掩码都无所谓......
    • 对于 64 位值使用 64 位变量并将位移位更改为 63
    • 或将另外 8 个零添加到掩码十六进制数

[注释]

  • 现在您只需要在 b==0 时添加大小写 ...

[edit1] 没有 if/else 用于 float

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 处理为用于位访问的整数类型的指针
  • 前半部分清除a中的符号位
  • second 从b复制符号位

关于php - 如何根据另一个值设置一个值的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29025179/

相关文章:

php - Laravel 错误 Symfony\Component\HttpKernel\Exception\NotFoundHttpException

php - 如果使用 cronjob 条件用户 ID 存在于另一个表中,则尝试更新数据库标志

java - Greedy Best First Search 使用队列还是堆栈?

c - 字符串排序并删除重复项

javascript - 为什么 writeln();不生产新生产线?

php - 让页面在访问者刷新时更新字段

php - 背景图片对齐

algorithm - 三堆 Wythoff 博弈的 Cold Positions

sql-server - 如何通过累积连接获取 SQL 中字符串值的分组

python - 为什么这个 python if 语句不等于 true?