# Exotic add function in JavaScript

## JavaScript performance comparison

Test case created by Jeroen

## Info

Comparison between add functions. View the gist here

## Preparation code

`` <script>  Benchmark.prototype.setup = function() {    function add_normal() {      // Start from zero      var total = 0;          // Floating-points, bah!      // 1e12 = 1000000000000.      var factor = 1e12;          // Undefined, set in the loop      var value;          // Something to iterate on      var i = arguments.length;          // Loop through all the parameters      while (i--) {        // Multiply by 1e12, to account for peculiarities        // of doing addition with floating-point numbers.        value = parseFloat(arguments[i]) * factor;            // Is it not, not a number?        // Then hey, it's a number!        if (!isNaN(value)) {           total += value;        }      }          // Divide back by 1e12, because we multiplied by      // 1e12 to account for floating-point weirdness.      return total/factor;    }        // can you figure it?    function add_exotic() {      var args = [].slice.call(arguments), total = 0;                for (;args.length; args.shift()) {        !args[0] || typeof args[0] === 'boolean' || (total += parseFloat( !(args[0]*1) ? 0 : args[0] ) * 1e12);       }                return total/1e12;    }      };</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
``// Should equal 15add_normal(1, 2, 3, 4, 5);// Should equal 0add_normal(5, null, -5);// Should equal 10add_normal('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1);// Should equal 0.3, not 0.30000000000000004add_normal(0.1, 0.2);``
pending…
``// Should equal 15add_exotic(1, 2, 3, 4, 5);// Should equal 0add_exotic(5, null, -5);// Should equal 10add_exotic('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1);// Should equal 0.3, not 0.30000000000000004add_exotic(0.1, 0.2);``
You can edit these tests or add even more tests to this page by appending `/edit` to the URL.