I've corrected my post above. Nevertheless, there are still differences. PoolMath is always using weight % NaOCl. That's OK if it said that explicitly, but it should allow one to enter Trade % (or at least display it) since that is more common for chlorinating liquid. Also, it is using a constant density of 1.08 and that is clearly wrong because the higher chlorine concentrations have higher density. Unfortunately, it's not always consistent for real product because they vary in how much excess lye they have and that also affects the density, but I use "good chlorine" density numbers that have smaller amounts of excess lye in them.
So at a minimum, we'll correct this to use an interpolated table of density so that at least the weight % entry will be more accurate. As to whether Trade % can be added or used, we'll see. I'm in communication with Jason on this since he wrote the app based on my spreadsheet numbers.
As for the CSI, the PoolMath calculation does not account for ion pairs since that is rather complex, but the error is only around 0.02 so not anything to worry about.