Lo que todo programador debería saber sobre aritmética de punto flotante
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Corregidos pequeños errores tipográficos

+16 -16
+2 -2
basic/index.html
··· 29 29 30 30 <p>No es estúpido, solo diferente. Los números decimales no pueden representar 31 31 con precisión un número como ⅓, así que lo tienes que redondear a algo como 32 - 0.33 - y no esperas que 0.33 + 0.33 + 0.33 sea igual a 1 tampoco, ¿no?</p> 32 + 0.33 ─ y no esperas que 0.33 + 0.33 + 0.33 sea igual a 1 tampoco, ¿no?</p> 33 33 34 34 <p>Los ordenadores usan <a href="/formats/binary/">números binarios</a> porque son más 35 35 rápidos de manejar, y porque para la mayoría de operaciones un error en la ··· 50 50 51 51 <p>En este caso, el resultado (0.5) <em>sí</em> puede ser representado de manera exacta como un 52 52 número de punto flotante, y es posible que los errores de redondeo de los datos de partida 53 - se cancelen entre sí - aunque no se debería confiar excesivamente en esto (e.g. cuando 53 + se cancelen entre sí ─ aunque no se debería confiar excesivamente en esto (e.g. cuando 54 54 esos dos números fueron almacenados en representaciones de punto flotante de diferente 55 55 tamaño, los errores de redondeo pueden no cancelarse entre ellos).</p> 56 56
+4 -4
errors/comparison/index.html
··· 34 34 diferencia es muy pequeña. El margen de error frente al que se compara esta diferencia 35 35 normalmente se llama <em>epsilon</em>. En su forma más simple:</p> 36 36 37 - <pre><code> if(Math.abs(a-b) &lt; 0.00001) // Mal - no hacer esto 37 + <pre><code> if(Math.abs(a-b) &lt; 0.00001) // Mal ─ no hacer esto 38 38 </code></pre> 39 39 40 40 <p>Esto es una mala forma de hacerlo porque un epsilon fijo elegido porque «parece ··· 43 43 números muy diferentes. Y cuando los números son muy grandes, el epsilon 44 44 puede acabar siendo más pequeño que el mínimo error de redondeo, por lo que 45 45 la comparación siempre devolvería «falso». Por tanto, es necesario ver si 46 - el <em>error relativo</em> es menor epsilon:</p> 46 + el <em>error relativo</em> es menor que epsilon:</p> 47 47 48 48 <pre><code> if(Math.abs((a-b)/b) &lt; 0.00001) // ¡Todavía no es correcto! 49 49 </code></pre> ··· 88 88 <p>Hay algunos casos en los que el método de arriba todavía produce resultados inesperados 89 89 (concretamente, es mucho más estricto cuando un valor es casi cero que cuando es 90 90 exactamente cero), y algunas de esas pruebas para las que fue desarrollado probablemente 91 - especifica un comportamiento que no es apropiado para algunas aplicaciones. ¡Antes de 92 - usarlo, asegúrate de que es adecuado para tu aplicación!</p> 91 + especifica un comportamiento que no es apropiado para algunas aplicaciones. Antes de 92 + usarlo, ¡asegúrate de que es adecuado para tu aplicación!</p> 93 93 94 94 <h2 id="comparando-valores-de-punto-flotante-como-enteros">Comparando valores de punto flotante como enteros</h2> 95 95
+2 -2
errors/rounding/index.html
··· 18 18 <p>Como los <a href="/formats/fp/">números de punto flotante</a> tienen un número de dígitos limitado, 19 19 no pueden representar todos los <a href="http://es.wikipedia.org/wiki/N%C3%BAmero_real">números reales</a> 20 20 de forma precisa: cuando hay más dígitos de los que permite el formato, los que sobran se 21 - omiten - el número se <em>redondea</em>. Hay tres razones por las que esto puede ser necesario:</p> 21 + omiten ─ el número se <em>redondea</em>. Hay tres razones por las que esto puede ser necesario:</p> 22 22 23 23 <ul> 24 24 <li><strong>Denominadores grandes</strong> ··· 34 34 a partir de un cierto punto. Por ejemplo, en decimal 1/4, 3/5 y 8/20 son finitos, porque 35 35 2 y 5 son los factores primos de 10. Pero 1/3 no es finito, ni tampoco 2/3 o 1/7 o 5/6, 36 36 porque 3 y 7 no son factores primos de 10. Las fracciones con un factor primo de 5 en el 37 - denominador pueden ser finitas en base 10, pero no en <a href="/formats/binary/">base 2</a> - la 37 + denominador pueden ser finitas en base 10, pero no en <a href="/formats/binary/">base 2</a> ─ la 38 38 mayor fuente de confusión para los principiantes en los números de punto flotante.</li> 39 39 <li><strong>Números no racionales</strong> 40 40 Los números irracionales no se pueden representar como una fracción regular, y en notación
+1 -1
formats/exact/index.html
··· 19 19 son mejores para que los ordenadores trabajen con ellos, y lo bastante buenos para 20 20 los humanos, a veces simplemente no son apropiados. En ocasiones los números de 21 21 verdad tienen que sumarse bien hasta el último bit, y no hay excusas técnicas 22 - aceptables - normalmente cuando los cálculos involucran dinero.</p> 22 + aceptables ─ normalmente cuando los cálculos involucran dinero.</p> 23 23 24 24 <p>Desgraciadamente, no hay un estándar dominante equivalente al IEEE 754 para esto 25 25 (la versión del 2008 añadió tipos decimales, pero es demasiado reciente para
+3 -3
formats/fp/index.html
··· 23 23 ¿Y <em>dónde</em> se necesita? ¿Cuántos dígitos enteros y cuántos fraccionarios?</p> 24 24 25 25 <ul> 26 - <li>Para un ingeniero construyendo una autopista, no importa si tiene 10 metros o 10.0001 metros de ancho - posiblemente ni siquiera sus mediciones eran así de precisas.</li> 27 - <li>Para alguien diseñando un microchip, 0.0001 metros (la décima parte de un milímetro) es una diferencia <em>enorme</em> - pero nunca tendrá que manejar distancias mayores de 0.1 metros.</li> 26 + <li>Para un ingeniero construyendo una autopista, no importa si tiene 10 metros o 10.0001 metros de ancho ─ posiblemente ni siquiera sus mediciones eran así de precisas.</li> 27 + <li>Para alguien diseñando un microchip, 0.0001 metros (la décima parte de un milímetro) es una diferencia <em>enorme</em> ─ pero nunca tendrá que manejar distancias mayores de 0.1 metros.</li> 28 28 <li>Un físico necesita usar la <a href="http://es.wikipedia.org/wiki/Velocidad_de_la_luz">velocidad de la luz</a> (más o menos 300000000) y la <a href="http://es.wikipedia.org/wiki/Constante_de_gravitaci%C3%B3n_universal">constante de gravitación universal</a> (más o menos 0.0000000000667) juntas en el mismo cálculo.</li> 29 29 </ul> 30 30 ··· 33 33 embargo, solo se necesita precisión <em>relativa</em>. Para satisfacer al físico, debe 34 34 ser posible hacer cálculos que involucren números de órdenes muy dispares.</p> 35 35 36 - <p>Básicamente, tener un número fijo de dígitos enteros y fraccionarios no es útil - y la solución es un formato con un <em>punto flotante</em>.</p> 36 + <p>Básicamente, tener un número fijo de dígitos enteros y fraccionarios no es útil ─ y la solución es un formato con un <em>punto flotante</em>.</p> 37 37 38 38 <h2 id="cmo-funcionan-los-nmeros-de-punto-flotante">Cómo funcionan los números de punto flotante</h2> 39 39
+1 -1
formats/integer/index.html
··· 28 28 <ul> 29 29 <li>Supone más trabajo (y más oportunidades de introducir bugs) hacerlo bien, especialmente en lo que concierne a los <a href="/errors/rounding/">métodos de redondeo</a>.</li> 30 30 <li>Los enteros tienen precisión completa, pero en un rango muy limitado, y cuando se desbordan, normalmente «dan la vuelta» silenciosamente: el mayor entero más 1 da cero (para enteros sin signo) o el valor negativo más grande en valor absoluto (para enteros con signo). Este es el peor comportamiento posible cuando se trabaja con dinero por razones obvias.</li> 31 - <li>El punto decimal implícito es defícil de cambiar y enormemente inflexible: si almacenas los dólares como céntimos, es simplemente imposible soportar el <a href="http://es.wikipedia.org/wiki/Dinar_barein%C3%AD">dinar bareiní</a>(1 dinar = 1000 fils) al mismo tiempo. Tendrías que almacenar la posición del punto decimal con los datos - el primer paso para implementar tu propio formato de <a href="/formats/fp/">punto flotante</a> decimal de precisión limitada (lleno de fallos y no estándar).</li> 31 + <li>El punto decimal implícito es difícil de cambiar y enormemente inflexible: si almacenas los dólares como céntimos, es simplemente imposible soportar el <a href="http://es.wikipedia.org/wiki/Dinar_barein%C3%AD">dinar bareiní</a>(1 dinar = 1000 fils) al mismo tiempo. Tendrías que almacenar la posición del punto decimal con los datos ─ el primer paso para implementar tu propio formato de <a href="/formats/fp/">punto flotante</a> decimal de precisión limitada (lleno de fallos y no estándar).</li> 32 32 </ul> 33 33 34 34 <p>Resumen: <strong>no se recomienda usar enteros</strong>. Haz esto solamente si no hay otra <a href="/formats/exact/">alternativa mejor</a>.</p>
+1 -1
index.html
··· 41 41 <li>Si te interesa, dar explicaciones detalladas de por qué los números de punto flotante tienen que funcionar así y qué otros problemas pueden surgir</li> 42 42 </ul> 43 43 44 - <p>Deberías ir a la sección de <a href="/basic/">Respuestas básicas</a> primero - ¡pero no termines ahí!</p> 44 + <p>Deberías ir a la sección de <a href="/basic/">Respuestas básicas</a> primero ─ ¡pero no termines ahí!</p> 45 45 46 46 <h3 id="sobre-la-notacin-y-la-nomenclatura">Sobre la notación y la nomenclatura</h3> 47 47
+2 -2
languages/python/index.html
··· 25 25 26 26 <h2 id="tipos-decimales">Tipos decimales</h2> 27 27 28 - <p>Python tiene un tipo de <a href="/formats/exact/">precision arbitraria</a> decimal llamado 28 + <p>Python tiene un tipo de <a href="/formats/exact/">precisión arbitraria</a> decimal llamado 29 29 <code>Decimal</code> en el módulo <code>decimal</code>, que también permite elegir el <a href="/errors/rounding/">método de 30 30 redondeo</a>.</p> 31 31 ··· 54 54 </code></pre> 55 55 56 56 <p><a href="/errors/rounding/">Métodos de redondeo</a> específicos y otros parámetros se pueden 57 - definir enun objeto <code>Context</code>:</p> 57 + definir en un objeto <code>Context</code>:</p> 58 58 59 59 <pre><code> getcontext().prec = 7 60 60 </code></pre>