[C con Clase] duda

Steven R. Davidson vze266ft en verizon.net
Mie Mar 12 23:51:13 CET 2008


Hola Felipe,

Felipe Alfaro Aguilar wrote:

> Hola
>  
> ¿Alguien podria ayudarme a comprender porqué en la busqueda del ulp, 
> aparentemente iguales, obtengo dos resultados distintos.
>  
> A) En la primera, escribo la secuencia
>               int k;
>               float ulp= 1.0 + pow(2,-k);   
>               while (ulp>1.0) k=k+1;
> Obtengo que la ultima vez que se cumple la condicion de while es para 
> k=23, resultado que corresponde bien a una maquina de 32 bits para 
> variables de tipo float.    
>  
> B) En la segunda opcion uso
>              int k;
>              float a=1.0, ulp=pow(2,-k);
>              while (a+ulp>a) k=k+1;
> Y aqui el ciclo termina con k=63.
>  

Me temo que tal y como has escrito el código fuente, tienes suerte de 
que termine el bucle 'while'. De hecho, tienes un 49,99% de probabilidad 
de salir de cualquiera de los dos bucles 'while'.

Tienes dos problemas:
1. El valor de 'k' es arbitrario, por que 'k' no fue inicialiazdo. Por 
lo tanto, 'k' puede contener un valor cualquiera. Si 'k' < 2, entonces 
el bucle 'while' entra en un bucle infinito, sin poder salir.

2. Las condiciones de ambos bucles 'while' no varían en cada iteración, 
porque no se basan en el cuerpo del bucle. Esto significa que tenemos 
dos posibles resultados:
- 1. La condición es verdadera implicando un bucle infinito.
- 2. La condición es falsa saliendo del bucle sin que 'k' sea modificada.


Lo más seguro es que querías modificar 'ulp' en cada pasada, 
incrementando 'k'. Por ejemplo,

int k=0;
float ulp = 1.0 + pow(2.0,-k);
while( ulp>1.0 )
   ulp = 1.0 + pow(2.0,-++k);


Espero haber aclarado la duda.

Steven







Más información sobre la lista de distribución Cconclase