<div dir="ltr">Hola César,<div class="gmail_extra"><br>2013/5/15 cesar arias <span dir="ltr"><<a href="mailto:sinatra435@hotmail.com" target="_blank">sinatra435@hotmail.com</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">



<div><div dir="ltr"><font face="Courier New">Hola hola, como estan, tengo un pequeño problema de comprencion, es el siguiente:<br><br>Hice un programa para ver como se almacena un valor punto flotante en memoria, es el siguiente:<br>
<br></font></div></div></blockquote><div><br></div><div style>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div dir="ltr"><font face="Courier New"><br>Supongo que el programa esta bien, pero no puedo interpretar los valores, quiero decir: la salida es la siguiente:<br><br>0.5  =     00000000 00000000 00000000 11111100<br>
1.0  =     00000000 00000000 00000001 11111100<br>2.0  =     00000000 00000000 00000000 00000010<br>3.0  =     00000000 00000000 00000010 00000010<br>4.0  =     00000000 00000000 00000001 00000010<br>5.0  =     00000000 00000000 00000101 00000010<br>
6.0  =     00000000 00000000 00000011 00000010<br>7.0  =     00000000 00000000 00000111 00000010<br>8.0  =     00000000 00000000 00000000 10000010<br>9.0  =     00000000 00000000 00001000 10000010<br>10.0 =     00000000 00000000 00000100 10000010<br>
<br>sizeof(union punto): 4<br><br><br>*****************************************************<br><br>Segun un libro que leo se supone que la salida de 0.5 debe ser:<br><br></font><font face="Courier New">0.5  =     00000000 00000000 00000101 11111111</font><br>
<br>ya que los primeros tres octeto escrito representa el valor 5 y el ultimo octeto reprecenta el valor -1, entonces el valor se lo interpreta de la siguiente manera:<br><br>5 * 10^(-1)    =   0.5<br><br>donde 10 es un valor necesario en la interpretacion de los valores flotante.<br>
<br></div></div></blockquote><div><br></div><div style>Esto no es correcto en la informática; ni desde luego desde el punto de vista del procesador. En primer lugar, al tratarse de una secuencia binaria, tenemos que tratar los números en base 2. En matemáticas, la respuesta sería,</div>
<div style><br></div><div style>0,5 (decimal) = 0,1 (binario)</div><div style><br></div><div style>En notación científica (de base 2), esto sería:<br><br>1 x 2^(-1)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div dir="ltr">Como podemos ver, la secuencia de bits en la salida no es la esperada.<br><br>Entiendo que hay varias formas de interpretar valores para una computadora, o puede ser tambien que el programa esté resuelto de una forma incorrecta, pero me inclino por lo primero.<br>
<br>Espero me puedan ayudar con este dilema, creo que es basico conoser como se almacenan e interpretan los numeros en la memoria.<br>Gracias por sus respuestas.<br>                                           </div></div>
<br></blockquote><div><br></div><div style>El problema es que los procesadores no guardan esta información ni la tratan como las matemáticas ni como la notación científica. Los procesadores para números de coma flotante de 32 bits siguen el estándar de IEEE 754. El esquema viene a ser el siguiente:<br>
<br>32 | 31 30 ... 24  | 23 22 21 .... 1 0</div><div style>---+----------------+---------------------</div><div style> s  |         ed        |      mantisa</div><div style><br></div><div style><br></div><div style>s : 1 bit para el signo (negativo = 1 ; positivo = 0)</div>
<div style>ed : 8 bits para el signo exponente desplazado por 127; es decir, guardamos: 127-exponente (verdadero)<br></div><div style>mantisa : 23 bits para la mantisa: la parte fraccionaria de la notación científica<br></div>
<div style><br></div><div style>Por ejemplo, si queremos representar 0,3 en el formato IEEE 754, haríamos esto:<br><br>s = 0, porque es positivo</div><div style><br></div><div style>Queremos hacer esto:</div><div style><br>
</div><div style>0,3 = (1 + mantisa) x 2^exponente</div><div style><br></div><div style>que es equivalente a,</div><div style><br></div><div style>0,3 / 2^exponente = 1 + mantisa</div><div style><br></div><div style>que en el ejemplo viene a ser:<br>
<br></div><div style>0,3 / 2^(-2) = 1,2</div><div style><br></div><div style>así que el exponente desplazado será: 127 - 2 = 125 (01111101 en binario)</div><div style><br></div><div style>Ahora tenemos que convertir 0,2 a binario:</div>
<div style><br></div><div style>00110011001100110011010<br></div><div style><br></div><div style>Al final, obtendremos la secuencia:<br><br>0 01111101 00110011001100110011010</div><div style><br></div><div style><br></div>
<div style>En cuanto a tu programa, tienes que tener en cuenta que los procesadores tratan los valores en grupos de bytes, ordenados de forma particular. Algunos procesadores ordenan los bytes tal y como esperas: los más significativos son los primeros - conocido como "big-endian"; otros ordenan en el sentido inverso: los menos significativos van primero - conocido como "little-endian". Si usas un procesador de Intel, entonces estamos en el caso de "little-endian". Esto significa que debes invertir el orden de la secuencia binaria. Ahora mismo te sale esto:<br>
<br>0.5  =      00000000 00000000 00000000 11111100<br></div><div style><br></div><div style>Cuando debería interpretarse así:<br><br>00111111 00000000 00000000 00000000<br></div><div style><br></div><div style><br></div>
<div style>Espero que esto aclare las dudas.</div><div style><br></div><div style>Steven</div><div style><br></div></div></div></div>