// E09 OPTIONAL: printing more digits does not improve stored accuracy.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <limits>

int main() {
    const float f = 0.1f;
    const double from_float = static_cast<double>(f);
    const double d = 0.1;
    std::cout << std::setprecision(std::numeric_limits<double>::max_digits10);
    std::cout << "float promoted to double = " << from_float << '\n';
    std::cout << "double initialized directly = " << d << '\n';
    std::cout << "float radix=" << std::numeric_limits<float>::radix
              << " digits=" << std::numeric_limits<float>::digits
              << " epsilon=" << std::numeric_limits<float>::epsilon() << '\n';
    std::cout << "double radix=" << std::numeric_limits<double>::radix
              << " digits=" << std::numeric_limits<double>::digits
              << " epsilon=" << std::numeric_limits<double>::epsilon() << '\n';
    if (!std::isfinite(from_float) || !std::isfinite(d)) return 1;
    return 0;
}
