/* testa limites de magnitudes para números reais resultado dependente da arquitetura da máquina onde se executa */ #include #include #define DOUBLE_EPS 1.0e-15 #define FLOAT_EPS 1.0e-7f #define MINUSCULO 1.0e-20 int main(void) { float f; double d; long double t; /* long double esquisito nessa maquina */ /* memoria usada */ printf("Memoria usada para um float = %1d\n",sizeof(float)); printf("\tpara um double = %1d\n",sizeof(double)); printf("\tpara um long double = %1d\n",sizeof(long double)); /* testes para valores grandes */ f = 1.2345e+20f; d = 1.2345e+20; /* provável que ambos consigam acomodar */ printf("\nValor razoavel:\n\tf = %-20.8e\n\td = %-20.8e\n",f,d); f = 1.2345e+100f; /* float consegue acomodar? */ d = 1.2345e+100; /* e o double? */ printf("Valor alto:\n\tf = %-20.8e\n\td = %-20.8e\n",f,d); d = 1.2345e+500; /* double ainda aguenta? */ printf("Valor muito alto:\n\td = %-20.8e \n",d); /* estranho ... nesse compilador e nessa maquina ... OK no gcc Linux */ t = 1.2345e+500L; printf("\nValor super muito alto:\n\tt = %Le\n",t); /* testes para valores pequenos */ f = d = 1.2345e-20f; /* provável que ambos consigam acomodar */ printf("\nValor razoavel:\n\tf = %-20.8e\n\td = %-20.8e\n",f,d); f = 1.2345e-100; /* float consegue acomodar? */ d = 1.2345e-100; /* e o double? */ printf("Valor baixo:\n\tf = %-20.8e\n\td = %-20.8e\n",f,d); d = 1.2345e-500; /* double ainda aguenta? */ printf("Valor muito baixo:\n\td = %-20.8e\n",d); /* testes para interstícios */ f = 1.0f; d = 1.0; /* sem problemas */ f = f + FLOAT_EPS; /* FLOAT_EPS é maior que o intersticio mínimo para float? */ d = d + DOUBLE_EPS; /* e DOUBLE_EPS para double? */ printf("\nTeste de intersticio:\n\tf = %-30.20e\n\td = %-30.20e\n",f,d); f = 1.0f; f = f + DOUBLE_EPS; /* será que DOUBLE_EPS ainda faz diferença em um float? */ d = 1.0; d = d + MINUSCULO; /* será que MINUSCULO ainda faz diferença em um double? */ printf("Tentando intersticios menores:\n\tf = %-30.25f\n\td = %-30.25f\n",f,d); system("PAUSE"); return 0; }