2010-05-03 25 views
6

Estoy intentando comprender cómo funcionan los números de coma flotante.C - redondeo de coma flotante

creo que me gustaría probar lo que sé/necesidad de aprender mediante la evaluación de lo siguiente: Me gustaría encontrar la más pequeña x tal que x + 1 = x, donde x es un número de coma flotante.

Según tengo entendido, esto sucedería en el caso en que x sea lo suficientemente grande para que x + 1 esté más cerca de x que el siguiente número mayor que x representable por coma flotante. Tan intuitivamente parece que sería el caso donde no tengo suficientes dígitos en el significado. ¿Sería este número x el número donde el significado es todo 1? Pero parece que no puedo entender qué debería ser el exponente. Obviamente, tendría que ser grande (en relación con 10^0, de todos modos).

+2

Como lo preguntas, menos el infinito :-) Probablemente quieras el número positivo más pequeño y no el número más pequeño. – AProgrammer

Respuesta

5

Sólo se necesita una expresión para el valor del bit LS en la mantisa en términos del exponente. Cuando esto es> 1, entonces has cumplido tu condición. Para un solo flotador de precisión, el bit LS tiene un valor de 2^-24 * 2^exp, por lo que la condición se cumpliría cuando exp sea> 24, es decir, 25. El número más pequeño (normalizado) en que se cumpliría esta condición sería, por lo tanto, ser 1.0 * 2^25 = 33554432.0f.

No he comprobado esto, por lo que mis cálculos pueden estar fuera de lugar (por ejemplo, en un factor de 2) y también es posible que la unidad FP redondee más allá del bit 24, por lo que puede haber un factor adicional de 2 necesario para dar cuenta de esto, pero se obtiene la idea general ...

+1

¡Oh hombre, literalmente lo descubrí JUSTO como lo publicaste! ¡Bonito! – sepiroth

+0

+1. Tenga en cuenta que puede redondear hacia + infinito, en cuyo caso la respuesta es + infinito. – AProgrammer

+1

En realidad, x = 2^24 es el primer flotante que cumple la condición (cualquier cantidad mayor que 2^24 - 1 requiere 25 bits, y por lo tanto, más de un flotante puede contener exactamente). –

0

de inicio con 1,0, y seguir doblando hasta que la prueba tiene éxito:

double x; 
for (x = 1.0; x + 1 != x; x *= 2) { } 
printf("%g + 1 = %g\n", x, x + 1); 
+0

probándolo no significa que entiendo por qué :) preferiría razonar primero. Supongo que esta publicación es más general acerca de cómo el redondeo se incorpora a la matemática de punto flotante, como lo demuestra la pregunta de muestra que propongo. – sepiroth

0

Sugiero que al tratar de entender los números fp y la aritmética fp se trabaja en decimal con 5 dígitos en el significado y 2 en el exponente. (O, si 5 y 2 no le conviene, 6 y 3, o cualquier otro número de pequeños que les gusta.) Los temas de:

  • el conjunto limitado de números que pueden ser representados;
  • no conmutatividad, no asociatividad y no distributividad;
  • los problemas que pueden surgir al tratar los números f-p como números reales;

son mucho más fáciles de entender en decimales y las lecciones que aprende son completamente generales. Una vez que hayas descifrado esto, mejorar tus conocimientos con la aritmética IEEE f-p será relativamente sencillo. También podrá descubrir otros sistemas aritméticos f-p con relativa facilidad.

Cuestiones relacionadas