/// <summary>Subtracts another summator.</summary>
            internal void Sub(com.epl.geometry.MathUtils.KahanSummator v)
            {
                /* const */
                double y = -(v.GetResult() - v.compensation) - compensation;
                double t = sum + y;
                double h = t - sum;

                compensation = h - y;
                sum          = t;
            }
        public static void TestKahanSummation()
        {
            double s = 0.0;

            for (int i = 0; i < 10000; i++)
            {
                if (i == 0)
                {
                    s += 1e6;
                }
                else
                {
                    s += 1e-7;
                }
            }
            double trueAnswer = 1e6 + 9999 * 1e-7;

            NUnit.Framework.Assert.IsTrue(System.Math.Abs(s - trueAnswer) > 1e-9);
            // precision loss
            com.epl.geometry.MathUtils.KahanSummator sum = new com.epl.geometry.MathUtils.KahanSummator(0);
            for (int i_1 = 0; i_1 < 10000; i_1++)
            {
                if (i_1 == 0)
                {
                    sum.Add(1e6);
                }
                else
                {
                    sum.Add(1e-7);
                }
            }
            double kahanResult = sum.GetResult();

            // 1000000.0009999000 //C++
            // 1000000.0009999 //Java
            NUnit.Framework.Assert.IsTrue(kahanResult == trueAnswer);
        }
 internal com.epl.geometry.MathUtils.KahanSummator MinusEquals(com.epl.geometry.MathUtils.KahanSummator v)
 {
     /* const */
     Sub(v);
     return(this);
 }