Как установить знак значения на основе другого

Я работаю с 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 есть функции, которые могут сделать это легко. Любые указатели, кто-нибудь?

Благодарю.

0

Решение

Вы можете сделать это разными способами, ваш подход может изменить предварительное вычисление суммы суммы (с плавающей запятой) из-за умножения и деления … вот еще несколько опций a быть твоим num а также b 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. извлечение знакового бита

    • знак — это, как правило, 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 или битовая маска …
    • для 64-битных значений используйте 64-битную переменную и измените битовый сдвиг на 63
    • или добавьте еще 8 нулей к шестнадцатеричному числу маски
[заметки]
  • теперь нужно просто добавить случай, когда 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 как целочисленного типа для доступа к битам
  • Первая половина очистить знак немного в
  • второй копирует бит знака из b
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]