Как пропорционально уменьшить положительные и отрицательные числа

У меня есть две переменные:

$points - could be positive or negative
$time_elapsed -is always positive

Я пытаюсь пропорционально уменьшить $points основанный на $time_elapsed, Я не могу использовать вычитание, потому что оно не «пропорционально» так, как мне нужно. Мне нужно что-то похожее на деление, но это всегда уменьшает $ очков (деление увеличивает число, если оно отрицательное), так что я получаю следующий результат:

$points = -12;
$time_elapsed = 4;
$points/time_elapsed = -48;

$points = 12;
$time_elapsed = 4;
$points/time_elapsed = 3;

Я не могу использовать abs (), потому что он будет возвращать -3, когда баллы равны -12, когда мне действительно нужно, чтобы он возвращал -48 (мне всегда нужно что-то, что в $ time_elapsed раз меньше, чем $ points).
Я не могу использовать, если условия или что-нибудь подобное. Это вообще возможно?

0

Решение

Это будет работать Без условий!

Скрипка здесь

function getPoints($points, $time_elapsed)
{
$is_positive = $points > 0;

$converters = [
true => function($points, $time_elapsed) {
return $points / $time_elapsed;
},
false => function($points, $time_elapsed) {
return $points * $time_elapsed;
}
];

return $converters[$is_positive]($points, $time_elapsed);
}

echo getPoints(-12, 4), PHP_EOL;
echo getPoints(12, 4), PHP_EOL;
0

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

Вы можете извлечь бит знака и использовать его, чтобы избежать условных операторов (хотя это ограничение — странная идея):

 $sgn = ($points >> 31) & 1  //(for 32-bit variables)
return   $points * $sgn * $time + $points * (1 - $sgn) / $time

//returns $points * $time for negative and $points / $time for positive
0

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