#include <iostream>
#include <limits>
#include <typeinfo>

#if 0
#define ACTION(x) (T)(x)
#else
#define ACTION(x) x
#endif

template< typename T >
void zeige_epsilon()
{
    using namespace std;
    T eps = 1;
    int radix = std::numeric_limits<T>::radix;
    for( T next_eps = eps; ACTION(T(1) + next_eps) > T(1); next_eps = eps/radix )
        eps = next_eps;
    cout << "Mein epsilon                     : " << eps << endl;

    cout << "numeric_limits< " << typeid(T).name() << " >::epsilon: " << numeric_limits< T >::epsilon() << endl;
    cout << "Beide Epsilons sind " << (eps == numeric_limits< T >::epsilon()? "gleich": "verschieden") << "\n" << endl;
}

int main()
{
    zeige_epsilon< double >();
    zeige_epsilon< float >();
    zeige_epsilon< long double >();
    return 0;
}