1. ホーム
  2. javascript

[解決済み] javascriptでのNumber.sign()

2022-11-15 03:39:12

質問

数の符号を見つけるための自明でない方法があるのだろうか ( 符号関数 )?

明らかなものよりも短い/速い/よりエレガントなソリューションがあるかもしれません。

var sign = number > 0 ? 1 : number < 0 ? -1 : 0;


短い答え!

これを使えば安全で速い(ソースはこちら。 moz )

if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };

性能と型強制の比較に目を向けるとよいでしょう フィドル

長い時間が経過しました。これは主に歴史的な理由によるものです。


結果

今のところ、これらの解決策があります。


1. 明白で速い

function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }


1.1. 変更点 kbec - 一種類のキャストを減らし、より高性能に、より短く。 [最速】の]

function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }

注意 sign("0") -> 1


2. エレガント、ショート、ノット・ソー・ファスト [最も遅い】。]

function sign(x) { return x && x / Math.abs(x); }

注意 sign(+-Infinity) -> NaN , sign("0") -> NaN

現在のところ Infinity はJSで合法的な番号であるため、この解決策は完全には正しくないようです。


3. 芸術...しかし非常に遅い [最も遅い]。

function sign(x) { return (x > 0) - (x < 0); }


4. ビットシフトの利用

は高速ですが sign(-Infinity) -> 0

function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }


5. タイプセーフ [メガファスト]

! ブラウザ(特にクロームのv8)はいくつかの魔法のような最適化を行い、この解決策は他のものよりはるかにパフォーマンスが高いことが判明しているようです。

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}


ツール

改良を歓迎します!


[Offtopic] 回答受付中

  • アンドレイ・タランツォフ - しかし、悲しいことに、それは明白なアプローチよりも約5倍も遅いです。

  • フレデリック・ハミディ - は、(現時点では)最も多く投票された回答で、ちょっとクールですが、物事がどのように行われるべきかという点では、間違いなく間違っています。また、無限大の数を正しく扱えませんし、それは数字でもあります。

  • ケベック - は、明らかな解決策の改善です。それほど革命的ではありませんが、すべてを総合すると、この方法がベストだと考えています。彼に一票を投じましょう :)

どのように解決するのですか?

よりエレガントなバージョンの高速な解決策です。

var sign = number?number<0?-1:1:0