Autor Tema: Duplicar un número con coma flotante

0 Usuarios y 1 Visitante están viendo este tema.

23 Julio, 2024, 10:22 pm
Leído 1082 veces

imaginaryboy

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 134
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Resulta que quiero hacer un programa en lenguaje ensamblador el cual duplica un número representado en punto flotante de 64 bits.
El número float64 está conformado como sigue:

- El bit 63 es el bit de signo.
- Los bits para el exponente son los bits \( [62...52] \).
- Los bits de la parte fraccionaria son \( [51...0] \).

Mi problema no está en la parte algorítmica, sino en cómo lograr matemáticamente que el número sea duplicado.
Le pregunté a ChatGPT y me respondió que simplemente le sume 1 al exponente, pero no creo que ese sea el modo de duplicar un número en tal formato, ¿o si? :banghead:

Saludos




24 Julio, 2024, 09:26 am
Respuesta #1

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

Resulta que quiero hacer un programa en lenguaje ensamblador el cual duplica un número representado en punto flotante de 64 bits.
El número float64 está conformado como sigue:

- El bit 63 es el bit de signo.
- Los bits para el exponente son los bits \( [62...52] \).
- Los bits de la parte fraccionaria son \( [51...0] \).

Mi problema no está en la parte algorítmica, sino en cómo lograr matemáticamente que el número sea duplicado.
Le pregunté a ChatGPT y me respondió que simplemente le sume 1 al exponente, pero no creo que ese sea el modo de duplicar un número en tal formato, ¿o si? :banghead:

 Es como dice ChatGPT, entendiendo que trabajamos en base \( 2 \), incluida la base de la potencia, como está por ejemplo aquí explicado:

https://es.wikipedia.org/wiki/Formato_en_coma_flotante_de_simple_precisi%C3%B3n

 Es decir, el número se escribe como:

\(  signo\quad 0.\text{parte decimal en binario}\cdot 2^{\text{expontente en binario}} \)

 Por ejemplo si es positivo, con parte decimal (no escribo todos los bits) \( 1011101 \) y exponente \( 101 \) sería:

\(  0.1011101_{2)}\cdot 2^{101_{2)}} \)

 Entonces multiplicar por dos efectivamente es incrementar uno el exponente.

Saludos.

24 Julio, 2024, 11:44 am
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si b es la base, multiplicar un número x cualquiera por b , siempre  resulta en la misma expresión numerica y una cifra final adicional de un cero, si tienes que escribirlo como float, los números 51 a 0 sera identico, pero debes sumar uno al exponente  de la base


2×2=4 en decimal
10x10= 100 es la misma operación en binario es 10 con un cero final es decir  tu exponente  creció una unidad.


7x2=14
111×10=1110
Como b en su propia base b se escribe siempre 10, multiplicar por b es es el mismo número con un cero final.


Para el caso decimal es mas obvio con b=10


123x10=1230
Partes de $$1.23 \times 10^2$$ y llegas $$1.23\times10 ^3$$ subiste en 1 el exponente .
Saludos  \(\mathbb {R}^3\)

25 Julio, 2024, 06:50 pm
Respuesta #3

imaginaryboy

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 134
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Cómo trabajamos en base dos, incluida la base de la potencia (me había olvidado de poner esto en el primer mensaje) con lo que me han dicho entonces para duplicar incremento en uno al exponente, para multiplicar por cuatro le sumo dos al exponente, y así (mientras sea potencia de dos).
Para dividir por dos, entonces le resto uno al exponente, para dividir por cuatro le resto dos al exponente, y así (mientras sea potencia de dos).

Muchachos muchas gracias por la ayuda. Ahora lo comprendo mejor.

Que estén bien.


25 Julio, 2024, 06:55 pm
Respuesta #4

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Cómo trabajamos en base dos, incluida la base de la potencia (me había olvidado de poner esto en el primer mensaje) con lo que me han dicho entonces para duplicar incremento en uno al exponente, para multiplicar por cuatro le sumo dos al exponente, y así (mientras sea potencia de dos).
Para dividir por dos, entonces le resto uno al exponente, para dividir por cuatro le resto dos al exponente, y así (mientras sea potencia de dos).

Muchachos muchas gracias por la ayuda. Ahora lo comprendo mejor.

Que estén bien.
Correcto
Saludos  \(\mathbb {R}^3\)

26 Julio, 2024, 06:08 pm
Respuesta #5

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Coincido con ChatGPT y las respuestas dadas en el hilo.

Solamente quiero agregar un detalle a tu (donde tú = imaginaryboy)
descripción del formato de punto flotante.
De acuerdo a los estándares vigentes, hay 1 bit adicional en la mantisa,
el cual no se representa.

Si la mantisa es M, la precisión de la mantisa es P,
el exponente es E, el corrimiento del exponente es B,
y el signo es S,
el número representado es:

\[ x = (-1)^S\cdot(1+M/2^P)\cdot 2^{E-B}. \]

Es claro que al sumar 1 al exponente repetidamente se alcanza un tope,
y lo mismo pasa al restar 1 repetidamente.

Así que hay que ser conciente de esa limitación al usar la solución propuesta,
que puede dar errores de overflow o underflow con valores extremos del exponente.



26 Julio, 2024, 06:42 pm
Respuesta #6

imaginaryboy

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 134
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Verdad el enunciado no lo aclara, sospecho que es un número en formato doble precisión IEEE-754. Así que cuando el exponente sea el máximo o mínimo vamos a caer en los casos especiales.

Gracias por tu observación  :)