本人遇到的這個問題是使用迭代程序造成內存泄漏(批量轉換時,在數據量較小時無問題,超過一定數量就崩潰),將其改成循環程序解決!實例如下:
遞歸算法:
public double GetBottomLatitude(double Bf0, double x, double a, double f, double[] gaussCoefficient) {
double e1Square = 2 * f - f * f;// first eccentricity square
double FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
double FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
double Bf1 = Bf0 + (x - FB0) / FB1;
if (Math.Abs(Bf0 - Bf1) < 0.00000000000005) {
return Bf1;
} else {
return GetBottomLatitude(Bf1, x, a, f, gaussCoefficient);
}
}
循環算法:
public double GetBottomLatitude(double Bf0, double x, double a, double f, double[] gaussCoefficient) {
double e1Square = 2 * f - f * f;// first eccentricity square
double FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
double FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
double Bf1 = Bf0 + (x - FB0) / FB1;
while (Math.Abs(Bf0 - Bf1) >0.00000000000005)
{
Bf0 = Bf1;
FB0 = a * (1 - e1Square) * (gaussCoefficient[0] * Bf0 - gaussCoefficient[1] * Math.Sin(2 * Bf0) + gaussCoefficient[2] * Math.Sin(4 * Bf0) - gaussCoefficient[3] * Math.Sin(6 * Bf0) + gaussCoefficient[4] * Math.Sin(8 * Bf0) - gaussCoefficient[5] * Math.Sin(10 * Bf0) + gaussCoefficient[6] * Math.Sin(12 * Bf0));
FB1 = a * (1 - e1Square) * (gaussCoefficient[0] - 2 * gaussCoefficient[1] * Math.Cos(2 * Bf0) + 4 * gaussCoefficient[2] * Math.Cos(4 * Bf0) - 6 * gaussCoefficient[3] * Math.Cos(6 * Bf0) + 8 * gaussCoefficient[4] * Math.Cos(8 * Bf0) - 10 * gaussCoefficient[5] * Math.Cos(10 * Bf0) + 12 * gaussCoefficient[6] * Math.Cos(12 * Bf0));
Bf1 = Bf0 + (x - FB0) / FB1;
}
return Bf1;
}