public static bool IsEqual(this sbyte[][] a, Decimal[][] b, Decimal atol = 0, Decimal rtol = 0) { if (a == null && b == null) return true; if (a == null ^ b == null) return false; int[] la = a.GetLength(true); int[] lb = b.GetLength(true); if (la.Length != lb.Length) return false; for (int i = 0; i < la.Length; i++) if (la[i] != lb[i]) return false; if (rtol > 0) { for (int i = 0; i < a.Length; i++) for (int j = 0; j < a[i].Length; j++) { var A = a[i][j]; var B = b[i][j]; decimal C = (decimal)A; decimal D = (decimal)B; if (C == D) continue; var delta = Math.Abs(C - D); if (C == 0) { if (delta <= rtol) continue; } else if (D == 0) { if (delta <= rtol) continue; } if (delta <= Math.Abs(C) * rtol) continue; return false; } } else if (atol > 0) { for (int i = 0; i < a.Length; i++) for (int j = 0; j < a[i].Length; j++) { var A = a[i][j]; var B = b[i][j]; decimal C = (decimal)A; decimal D = (decimal)B; if (C == D) continue; if (Math.Abs(C - D) <= atol) continue; return false; } } else { for (int i = 0; i < a.Length; i++) for (int j = 0; j < a[i].Length; j++) { var A = (decimal)a[i][j]; var B = (decimal)b[i][j]; if (A != B) return false; } } return true; }
public static bool IsEqual(this sbyte[,] a, Decimal[,] b, Decimal atol = 0, Decimal rtol = 0) { if (a == null && b == null) return true; if (a == null ^ b == null) return false; int[] la = a.GetLength(true); int[] lb = b.GetLength(true); if (la.Length != lb.Length) return false; for (int i = 0; i < la.Length; i++) if (la[i] != lb[i]) return false; unsafe { fixed (sbyte* ptrA = a) fixed (Decimal* ptrB = b) { if (rtol > 0) { for (int i = 0; i < a.Length; i++) { var A = ptrA[i]; var B = ptrB[i]; decimal C = (decimal)A; decimal D = (decimal)B; if (C == D) continue; var delta = Math.Abs(C - D); if (C == 0) { if (delta <= rtol) continue; } else if (D == 0) { if (delta <= rtol) continue; } if (delta <= Math.Abs(C) * rtol) continue; return false; } } else if (atol > 0) { for (int i = 0; i < a.Length; i++) { var A = ptrA[i]; var B = ptrB[i]; decimal C = (decimal)A; decimal D = (decimal)B; if (C == D) continue; if (Math.Abs(C - D) <= atol) continue; return false; } } else { for (int i = 0; i < a.Length; i++) { var A = (decimal)ptrA[i]; var B = (decimal)ptrB[i]; if (A != B) return false; } } } } return true; }