我正在使用一个 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
成为您的 num
和 b
anothernum
不同极性的数相乘结果为负
if ((a*b)<0.0) a=-a;
避免计算
if (((a<0.0)&&(b>0.0))||((a>0.0)&&(b<0.0))) a=-a;
符号位提取
- 在大多数语言/平台中,符号通常是 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/