Well its not a type system issue.
Making u = n, that'll returns true.
So the problem almost certainly lies with IEEE-754.
They are horrible to compare (float/double).
Unfortunately you are stuck calling functions like isClose to compare.
https://dlang.org/phobos/std_math_operations.html#.isClose
Full code extracted from above:
```d
import std;
void main()
{
auto m = new Matrix!(2)();
m.data = [1.0, 0.0, 0.0, 1.0].dup;
auto n = new Matrix!(2)();
n.data = [2.0, 3.0, 4.0, 5.0].dup;
auto u = mult(m, n);
writeln("u.data vs n.data:");
for (int i = 0; i < u.data.length; ++i)
writeln(u.data[i], "\t", n.data[i]);
// using opEquals() directly is working, but it doesn't seem to be
being used
//assert(opEquals(u,n),"\"opEquals(u, n)\" is failing."); // this
works fine
assert(u == n, "\"u == n\" is failing."); // this fails. Why?
}
class Matrix(size_t X, size_t Y = X)
{
const size_t x_length = X;
const size_t y_length = Y;
double[X * Y] data;
/// both matrices have to have an identical shape to compare
/// each element must be identical to match
bool opEquals(size_t X, size_t Y)(const Matrix!(X, Y) m1, const
Matrix!(X, Y) m2)
{
for (int i = 0; i < m1.data.length; ++i)
if (m1.data[i] != m2.data[i])
return false;
return true;
}
}
```