Replace std::numeric_limits<double>::min() with lowest() and epsilon()

This PR is motivated from #341 and removes all `std::numeric_limits<double>::min()` (ca 2e-308) and `std::numeric_limits<float>::min()` (ca 1e-38) existing in current codes with the following policy
- To get the minimum value of any floating point types, use `std::numeric_limits<T>::lowest()` 
- To compare floating point numbers, use `std::numeric_limits<T>::epsilon()` (machine epsilon, ca 1e-7 for float, 1e-16 for double) for the strictest comparison. Depending on magnitude of numbers, tolerances can be larger than the value. But I don't thin it make a sense to use a number smaller than the machine epsilon (e.g. `std::numeric_limits<T>::min()`).