fn cal(&self) -> f64 with this function, how come by default using the self keyword takes ownership rather than copying the data? Isn't this data stored all on the stack?
Rust needs to let the programmer decide whether their method should consume the object, take an exclusive reference, or a shared reference. Each of these cases needs its own syntax to specify it, and in rust those are self, &mut self, and &self; none of them is really “default.”
Being Copy actually increases your chance of increased memory usage, because it allows the compiler to transparently create extra copies of your data. And this, I presume, is why it's not default.
That's certainly not the only reason. It can also cause problems if you have a library and forgot to opt-out, because then adding a non-Copy field breaks the struct being Copy, which would be a breaking change to the library. However if it is opt-in, then this mistake is much harder to make.