# Signum Function (all)

## JavaScript performance comparison

Revision 5 of this test case created by disfated

## Info

Derived from this question on StackOverflow: Number.sign() in JavaScript

Versions of the test: test everythingonly numbersonly integers

Which approach do you think is the best?

## Preparation code

`` <script>  Benchmark.prototype.setup = function() {    // OUR TEST CODE (see other versions)    function test(sign) {      sign(1)                  // +1      sign(1908235)            // +1      sign(-.1e-1)             // -1      sign(Math.random()*2-1)  // ??      sign(0)                  //  0      sign(0.00000)            //  0      sign(+Infinity)          // +1      sign(-Infinity)          // -1      sign(NaN)                //  0 or NaN          // other types      sign("0")      sign("")      sign([])      sign("+23")      sign(null)      sign(undefined)    }            // 1. Obvious and fast    function sign1 (x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }        // 1.1 Modification from kbec - one type cast less, more performant, shorter    function sign1b(x) { return x ? x < 0 ? -1 : 1 : 0; }        // 2. Elegant, short, not so fast    function sign2 (x) { return x && x / Math.abs(x); }    // (some issues with several cases, see answer.)        // 3. The art... but very slow    function sign3 (x) { return (x > 0) - (x < 0); }        // 4. Using bit-shift    function sign4(x) { return (x >> 31) + (x > 0 ? 1 : 0); }        // 5. Type-safe:    function sign5 (x) {            return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;    }        // 5.1 Type-safe:    function sign5b (x) {            return (typeof x !== 'number' || isNaN(x)) ? NaN : (x ? x < 0 ? -1 : 1 : 0);    }  };</script>``

## Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
1. Obvious
``test(sign1)``
pending…
1.1. Not So Obvious
``test(sign1b)``
pending…
2. Elegant
``test(sign2)``
pending…
3. Artistic
``test(sign3)``
pending…
4. Bit-shift
``test(sign4)``
pending…
5. Safe
``test(sign5)``
pending…
5. Safe v2
``test(sign5b)``
pending…

## Revisions

You can edit these tests or add even more tests to this page by appending `/edit` to the URL. Here’s a list of current revisions for this page:

Comment form temporarily disabled.