- JavaScript's lack of mathematical precision
- PERL workaround
- Related links

While JavaScript is quickly becoming the lingua franca of the web, this general purpose language contains built-in limitations which restrict its use to simple applications. For example, I recently attempted to write a Diffie-Hellman Key-Exchange Demo in JavaScript but detected problems during testing which I traced to a lack of mathematical precision. Check out these comparisons:

JavaScript | Math.pow(7,18) | 1,628,413,597,910,449 | correct |

Calculator | 7^18 | 1,628,413,597,910,449 | correct |

JavaScript | Math.pow(7,19) | 11,398,895,185,373,144 | incorrect |

Calculator | 7^19 | 11,398,895,185,373,143 | correct |

JavaScript | Math.pow(7,20) | 79,792,266,297,612,000 | incorrect |

Calculator | 7^20 | 79,792,266,297,612,001 | correct |

JavaScript | Math.pow(7,21) | 558,545,864,083,284,030 | incorrect |

Calculator | 7^21 | 558,545,864,083,284,007 | correct |

- Many junior programmers think this problem is related to internal rounding but it is actually a limitation due to float-point math.
- Many seasoned programmers are surprised to learn that all JavaScript numbers (floating point or not) are stored in 64-bit floating point format (similar to JAVA's double) and there are no official alternative data types. Without an official integer data type, divisions may produce a fractional result.
- The only way to fix this IN YOUR JS PROGRAMS is to engage an external library
- References:
- JavaScript workarounds:
- https://github.com/iriscouch/bigdecimal.js (Big Decimal)
- https://github.com/silentmatt/javascript-biginteger/ (Big Integer)
- http://www-cs-students.stanford.edu/~tjw/jsbn/ (Big Number)

- Other workarounds:
- for client side software, switch to JAVA
- for server side software, switch to PERL

```
Legend: <sr> = system response
<ur> = user response
<sr> $
<ur> type bigint_demo.pl
#
# title: bigint_demo.pl
#
use bigint; # use bigint after this point
$x = 7 ** 19; # x = 7^19
printf("%s\n",$x); # "%s" because other formats bomb
<sr> $
<ur> perl bigint_demo.pl
<sr> 11398895185373143 ! correct
<ur> $
```

Back to Home

Neil Rieck

Kitchener - Waterloo - Cambridge, Ontario, Canada.