Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

293
Vistas
C: ¿El resultado de la aritmética de punto flotante SIEMPRE está normalizado?

Tenía curiosidad por estas cosas:

  1. ¿El lenguaje C siempre almacena los números de punto flotante en forma normalizada? (Es decir, ¿siempre se aplica la normalización?)
  2. ¿Esto también es cierto para los resultados obtenidos después de alguna aritmética (suma, multiplicación)?
  3. ¿Depende del idioma o del hardware - FPU?

Sería muy útil si puede citar alguna fuente. Revisé el documento IEEE-754, pero no pude encontrar ninguna declaración específica con respecto a la implementación.

Editar: suponga la especificación IEEE-754

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿El lenguaje C siempre almacena los números de punto flotante en forma normalizada?

"Depende." Como veremos, es más el hardware que el lenguaje C lo que determina esto.

Si la implementación usa algo que no sea IEEE-754 , no hay mucho que podamos decir.

Si la implementación usa IEEE-754, entonces todos los números siempre se almacenan normalizados, excepto los que no lo están, es decir, los subnormales .

¿Esto también es cierto para los resultados obtenidos después de alguna aritmética (suma, multiplicación)?

Sí. (Más sobre esto a continuación).

¿Depende del idioma o del hardware - FPU?

Por lo general, depende del hardware. La mayoría de las veces, suponiendo que el procesador de destino admita el punto flotante, un programa C se compila directamente en instrucciones nativas de punto flotante, sin ningún procesamiento adicional impuesto por el lenguaje o el compilador. (Esto contrasta con, por ejemplo, Java, que tiene una definición de punto flotante impuesta por el lenguaje, que es implementada en parte por la JVM).

El estándar C tiene una sección opcional, "Anexo F", que especifica una serie de comportamientos específicos de punto flotante, conforme a IEEE-754.

Ahora, si la implementación de C adopta el Anexo F y cumple con IEEE-754 (generalmente porque el hardware subyacente también lo es), las respuestas a sus dos primeras preguntas se vuelven aún más fáciles. En la aritmética binaria IEEE-754, con una excepción, no hay ambigüedades de representación. Cada número que se puede representar en forma normalizada tiene exactamente una representación normalizada. Cada número que no se puede representar en forma normalizada, pero que se puede representar como subnormal, tiene exactamente una representación subnormal. Estas restricciones se aplican a todos los números de punto flotante IEEE-754, incluidos (naturalmente) los resultados de otras operaciones.

(La excepción, como me recordaron Eric y Chux en un comentario, es cero, del cual IEEE-754 tiene dos, positivo y negativo).

Entonces, la respuesta a "¿El resultado siempre se normaliza?" es "No" (porque IEEE-754 definitivamente tiene esos subnormales y, por supuesto, cero), pero si la pregunta es "¿Todos los números tienen una representación única?", La respuesta es en su mayoría "Sí". (Excepto, nuevamente, para cero. O si es uno de los pocos que está haciendo algo con los formatos decimales IEEE-754-2008, que son mucho menos únicos). Consulte también Cómo distinguir entre 1 y cero flotante : valores de puntos?

La última pregunta, supongo, es "¿Cuántas implementaciones de C adoptan el Anexo F?" o, dicho de otra manera, "¿Cuántos procesadores cumplen con IEEE-754?" Para las CPU en computadoras de propósito general (computadoras centrales y computadoras personales), hasta donde yo sé, la respuesta en estos días es "Todas ellas". Las GPU, por otro lado, deliberadamente no son del todo compatibles con IEEE-754 (porque pueden ser incluso más increíblemente eficientes de esa manera). Microprocesadores, para trabajo "embebido", no estoy tan seguro. (A menudo no tienen ningún punto flotante viable).

over 4 years ago · Santiago Trujillo Denunciar

0

Sería muy útil si puede citar alguna fuente.

C 2018 5.2.4.2.2 3 define una representación de punto flotante para un número x como x = sb e Σ 1≤= k ≤ p f k b − k , donde s es el signo (±1), b es la base , e es un exponente entero en un rango de e min a e max , p es la precisión (número de dígitos en base b ) y f k son los dígitos en base b de la mantisa.

Luego el párrafo 4 dice:

Además de los números de punto flotante normalizados ( f 1 > 0 si x ≠ 0), los tipos flotantes pueden contener otros tipos de números de punto flotante, como números de punto flotante subnormales ( x ≠ 0, e = e min , f 1 = 0) y números de punto flotante no normalizados ( x ≠ 0, e > e min , f 1 = 0), y valores que no son números de punto flotante, como infinitos y NaNs…

Eso es; el estándar C guarda silencio sobre la normalización de los números de punto flotante, excepto que el Anexo F ofrece un enlace opcional a IEC 60559 (efectivamente IEEE 754). Así que esto responde a las preguntas:

¿El lenguaje C siempre almacena los números de punto flotante en forma normalizada? (Es decir, ¿siempre se aplica la normalización?)

No.

¿Esto también es cierto para los resultados obtenidos después de alguna aritmética (suma, multiplicación)?

No.

¿Depende del idioma o del hardware - FPU?

Depende de cada implementación de C. Las implementaciones de C pueden verse influenciadas por el hardware o pueden adoptar implementaciones de software de aritmética de punto flotante.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda