sqrt(-1.0) is NaN, it's typically used in numerical code where you can't stop and check for exceptions because performance is key.
But just for the sake of argument, the type of 'sqrt' isn't:
sqrt : R -> R
it is:
sqrt : R+ -> R+
So you have two options here. You can have sqrt return "Either Error Double" and force the programmer to deal with the possibility of an error (Rust does this) or you define a "nonnegative real" type that the compiler can guarantee will be an acceptable input for sqrt. The latter is much harder to do.
But either way no, you only need an "out of band" mechanism when the type system isn't strong enough or isn't being properly leveraged.