Now this is a bit confusing. I have to admit that I was thinking about the lowest value and thought std::numeric_limits<>::min() returned the lowest but that doesn't seem to be the case for floating point values. It actually returns the smallest/lowest positive value (greater than zero). For the lowest value use std::numeric_limits<>::lowest() instead.
#include <iostream>
#include <limits>
int main()
{
using limits = std::numeric_limits<double> ;
std::cout << "minimum positive normalised value: " << limits::min() << '\n'
<< "lowest normalised value: " << limits::lowest() << '\n'
<< std::boolalpha << "sub-normal values are supported: " << ( limits::has_denorm == std::denorm_present ) << '\n'
<< "for sub-mormal numbers, loss of precision is denormalization loss (not an inexact result): " << limits::has_denorm_loss << '\n'
<< "smallest positive sub-normal value: " << limits::denorm_min() << '\n' ;
}
minimum positive normalised value: 2.22507e-308
lowest normalised value: -1.79769e+308
sub-normal values are supported: true
for sub-mormal numbers, loss of precision is denormalization loss (not an inexact result): false
smallest positive sub-normal value: 4.94066e-324