Я работаю с 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 есть функции, которые могут сделать это легко. Любые указатели, кто-нибудь?
Благодарю.
Вы можете сделать это разными способами, ваш подход может изменить предварительное вычисление суммы суммы (с плавающей запятой) из-за умножения и деления … вот еще несколько опций 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;
извлечение знакового бита
для 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;
b==0
…[edit1] нет, если / еще для поплавков
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 как целочисленного типа для доступа к битамДругих решений пока нет …