Help us understand the problem. What is going on with this article?

JavaScriptのランプ関数いろいろ

More than 3 years have passed since last update.

ランプ関数とは

ランプ関数(Ramp function)とは、正(非負)の数を入力したときはそのままの数、
負の数が入力されたときはは0を返す関数です。

ランプ関数 - Wikipedia

似たような関数でクランプ(clamp)関数というのがありますが、
こちらの方が実用的だからか、あるいはランプ関数の方が吟味するほど味のある関数ではないからか、クランプ関数の方がよく目にする気がします。

Clamping (graphics) - Wikipedia, the free encyclopedia

実装例

条件分岐による方法

function ramp(x) {
  return (x < 0) ? 0 : x;
}

負の数だったら0、そうじゃなかったら入力値を返すという、定義に忠実な実装です。

max関数を使う方法

function ramp(x) {
  return Math.max(x, 0);
}

ちょっと数学的なやり方です(これも定義通り)。
引数を参照する部分が1つだけというのも良い点です。

符号関数を使う方法

function ramp(x) {
  return ((Math.sign(x) + 1) / 2) * x;
}

(Math.sign(x) + 1) / 2はステップ関数を表します。
ステップ関数がJavaScriptに組み込まれてないので、若干回りくどいです。
あと、もうちょっと工夫しないと、負の数でマイナスゼロが返ってきてしまいます。

文字列処理による方法

function ramp(x) {
  return Number(x.toString().replace(/^-.+/, 0));
}

正規表現でマイナスが付いているときだけ0に置換します。
入出力が両方文字列だった場合、x.replace(/^-.+/, '0')だけで済むので、その場合一番パフォーマンスがいいと思われます。

結論

直感ではありますが、一般用途ではmax関数を使う方法が一番素直でよいのではないでしょうか。

function ramp(x) {
  return Math.max(x, 0);
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした