Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

301
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!