#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 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8dHlwZWluZm8+CgojaWYgMAojZGVmaW5lIEFDVElPTih4KSAoVCkoeCkKI2Vsc2UKI2RlZmluZSBBQ1RJT04oeCkgeAojZW5kaWYKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4Kdm9pZCB6ZWlnZV9lcHNpbG9uKCkKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIFQgZXBzID0gMTsKICAgIGludCByYWRpeCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OnJhZGl4OwogICAgZm9yKCBUIG5leHRfZXBzID0gZXBzOyBBQ1RJT04oVCgxKSArIG5leHRfZXBzKSA+IFQoMSk7IG5leHRfZXBzID0gZXBzL3JhZGl4ICkKICAgICAgICBlcHMgPSBuZXh0X2VwczsKICAgIGNvdXQgPDwgIk1laW4gZXBzaWxvbiAgICAgICAgICAgICAgICAgICAgIDogIiA8PCBlcHMgPDwgZW5kbDsKCiAgICBjb3V0IDw8ICJudW1lcmljX2xpbWl0czwgIiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICIgPjo6ZXBzaWxvbjogIiA8PCBudW1lcmljX2xpbWl0czwgVCA+OjplcHNpbG9uKCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgIkJlaWRlIEVwc2lsb25zIHNpbmQgIiA8PCAoZXBzID09IG51bWVyaWNfbGltaXRzPCBUID46OmVwc2lsb24oKT8gImdsZWljaCI6ICJ2ZXJzY2hpZWRlbiIpIDw8ICJcbiIgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICB6ZWlnZV9lcHNpbG9uPCBkb3VibGUgPigpOwogICAgemVpZ2VfZXBzaWxvbjwgZmxvYXQgPigpOwogICAgemVpZ2VfZXBzaWxvbjwgbG9uZyBkb3VibGUgPigpOwogICAgcmV0dXJuIDA7Cn0=