···22<html lang="es">
33 <head>
44 <meta charset="utf-8">
55- <title>La Guía del Punto Flotante - Comparison</title>
55+ <title>La Guía del Punto Flotante - Comparación</title>
6677 <meta name="generator" content="nanoc 3.1.2">
8899- <meta name="Description" content="Explanation of the various pitfalls in comparing floating-point numbers.">
99+ <meta name="Description" content="Explicación de los diversos problemas al comparar números de punto flotante">
10101111 <link rel="stylesheet" type="text/css" href="/style.css" media="screen">
1212 <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">
···1414 </head>
1515 <body>
1616 <div id="main">
1717- <h1>Comparison</h1>
1818- <p>Due to rounding errors, most <a href="/formats/fp/">floating-point</a> numbers end up being slightly imprecise. As long as this
1919-imprecision stays small, it can usually be ignored. However, it also means that numbers expected
2020-to be equal (e.g. when calculating the same result through different correct methods) often differ
2121-slightly, and a simple equality test fails. For example:</p>
1717+ <h1>Comparación</h1>
1818+ <p>Debido a los errores de redondeo, la mayoría de los números de <a href="/formats/fp/">punto flotante</a>
1919+terminan siendo ligeramente imprecisos. Mientras esta imprecisión se mantenga pequeña,
2020+normalmente se puede ignorar. Sin embargo, esto significa también que números que se
2121+espera que sean iguales (por ejemplo al calcular el mismo resultado utilizando distintos
2222+métodos correctos) a veces difieren levemente, y una simple prueba de igualdad falla.
2323+Por ejemplo:</p>
22242325<pre><code> float a = 0.15 + 0.15
2426 float b = 0.1 + 0.2
2525- if(a == b) // can be false!
2626- if(a >= b) // can also be false!
2727+ if(a == b) // ¡Puede ser falso!
2828+ if(a >= b) // ¡También puede ser falso!
2729</code></pre>
28302929-<h2 id="dont-use-absolute-error-margins">Don’t use absolute error margins</h2>
3030-<p>The solution is to check not whether the numbers are exactly the same, but whether their difference is
3131-very small. The error margin that the difference is compared to is often called <em>epsilon</em>.
3232-The most simple form:</p>
3131+<h2 id="no-usar-mrgenes-de-error-absolutos">No usar márgenes de error absolutos</h2>
3232+3333+<p>La solución es comprobar no si los números son exactamente iguales, sino si su
3434+diferencia es muy pequeña. El margen de error frente al que se compara esta diferencia
3535+normalmente se llama <em>epsilon</em>. En su forma más simple:</p>
33363434-<pre><code> if( Math.abs(a-b) < 0.00001) // wrong - don't do this
3737+<pre><code> if(Math.abs(a-b) < 0.00001) // Mal - no hacer esto
3538</code></pre>
36393737-<p>This is a bad way to do it because a fixed epsilon chosen because it “looks small” could actually be way too
3838-large when the numbers being compared are very small as well. The comparison would return “true” for numbers that are quite different. And when the numbers are very large, the epsilon
3939-could end up being smaller than the smallest rounding error, so that the comparison always returns “false”.
4040-Therefore, it is necessary to see whether the <em>relative error</em> is smaller than epsilon:</p>
4040+<p>Esto es una mala forma de hacerlo porque un epsilon fijo elegido porque «parece
4141+pequeño» podría perfectamente ser demasiado grande cuando los números que se
4242+comparan son también muy pequeños. La comparación devolvería «verdadero» para
4343+números muy diferentes. Y cuando los números son muy grandes, el epsilon
4444+puede acabar siendo más pequeño que el mínimo error de redondeo, por lo que
4545+la comparación siempre devolvería «falso». Por tanto, es necesario ver si
4646+el <em>error relativo</em> es menor epsilon:</p>
41474242-<pre><code> if( Math.abs((a-b)/b) < 0.00001 ) // still not right!
4848+<pre><code> if(Math.abs((a-b)/b) < 0.00001) // ¡Todavía no es correcto!
4349</code></pre>
44504545-<h2 id="look-out-for-edge-cases">Look out for edge cases</h2>
4646-<p>There are some important special cases where this will fail: </p>
5151+<h2 id="vigila-los-casos-lmite">Vigila los casos límite</h2>
5252+5353+<p>Hay algunos casos especiales importantes para los que esto falla:</p>
47544855<ul>
4949- <li>When both <code>a</code> and <code>b</code> are zero. <code>0.0/0.0</code> is “not a number”, which causes an exception on some platforms, or returns false for all comparisons. </li>
5050- <li>When only <code>b</code> is zero, the division yields “infinity”, which may also cause an exception, or is greater than epsilon even when <code>a</code> is smaller. </li>
5151- <li>It returns <code>false</code> when both <code>a</code> and <code>b</code> are very small but on opposite sides of zero, even when they’re the smallest possible non-zero numbers.</li>
5656+ <li>Cuando tanto <code>a</code> como <code>b</code> son cero. <code>0.0/0.0</code> es NaN, lo que provoca una excepción en algunas plataformas o devuelve falso para todas las comparaciones.</li>
5757+ <li>Cuando solo <code>b</code> es cero, la división devuelve infinito, lo que también puede causar una excepción, o es mayor que epsilon incluso cuando <code>a</code> es más pequeño.</li>
5858+ <li>Devuelve «falso» cuando tanto <code>a</code> como <code>b</code> son muy pequeños pero a ambos lados del cero, incluso cuando son los números no nulos más pequeños.</li>
5259</ul>
53605454-<p>Also, the result is not commutative (<code>nearlyEquals(a,b)</code> is not always the same as <code>nearlyEquals(b,a)</code>). To fix these problems, the code has to get a lot more complex, so we really need to put it into a function of its own:</p>
6161+<p>Además, el resultado no es conmutativo (<code>nearlyEquals(a,b)</code> no es siempre lo mismo que
6262+<code>nearlyEquals(b,a)</code>). Para solucionar estos problemas, el código tiene que ser mucho más
6363+complejo, así que necesitamos meterlo en una función:</p>
55645665<pre><code> public static boolean nearlyEqual(float a, float b, float epsilon)
5766 {
···5968 final float absB = Math.abs(b);
6069 final float diff = Math.abs(a - b);
61706262- if (a == b) { // shortcut, handles infinities
7171+ if (a == b) { // Atajo, maneja los infinitos
6372 return true;
6464- } else if (a * b == 0) { // a or b or both are zero
6565- // relative error is not meaningful here
7373+ } else if (a * b == 0) { // a o b o ambos son cero
7474+ // El error relativo no es importante aquí
6675 return diff < (epsilon * epsilon);
6767- } else { // use relative error
7676+ } else { // Usar el error relativo
6877 return diff / (absA + absB) < epsilon;
6978 }
7079 }
7180</code></pre>
72817373-<p>This method <a href="../NearlyEqualsTest.java">passes tests</a> for many important special cases, but as you can see, it
7474-uses some quite non-obvious logic. In particular, it has to use a completely different definition of error margin
7575-when <code>a</code> or <code>b</code> is zero, because the classical definition of relative error becomes meaningless in those cases.</p>
8282+<p>Este método <a href="../NearlyEqualsTest.java">pasa las pruebas</a> para muchos casos especiales
8383+importantes, pero como puedes ver, utiliza cierta lógica no trivial. En particular,
8484+tiene que utilizar una definición totalmente distinta del margen de error cuando
8585+<code>a</code> o <code>b</code> son cero, porque la definición clásica del error relativo es inútil en
8686+esos casos.</p>
76877777-<p>There are some cases where the method above still produces unexpected results (in particular, it’s much stricter when one value is nearly zero than when it is exactly zero), and some of the tests
7878-it was developed to pass probably specify behaviour that is not appropriate for some applications. Before using it, make sure it’s appropriate for your application!</p>
8888+<p>Hay algunos casos en los que el método de arriba todavía produce resultados inesperados
8989+(concretamente, es mucho más estricto cuando un valor es casi cero que cuando es
9090+exactamente cero), y algunas de esas pruebas para las que fue desarrollado probablemente
9191+especifica un comportamiento que no es apropiado para algunas aplicaciones. ¡Antes de
9292+usarlo, asegúrate de que es adecuado para tu aplicación!</p>
9393+9494+<h2 id="comparando-valores-de-punto-flotante-como-enteros">Comparando valores de punto flotante como enteros</h2>
79958080-<h2 id="comparing-floating-point-values-as-integers">Comparing floating-point values as integers</h2>
8181-<p>There is an alternative to heaping conceptual complexity onto such an apparently simple task: instead of comparing <code>a</code> and <code>b</code> as <a href="http://en.wikipedia.org/wiki/Real_numbers">real numbers</a>, we can think about them as discrete steps and define the error margin as the maximum number of possible floating-point values between the two values. </p>
9696+<p>Hay una alternativa a aplicar toda esta complejidad conceptual a una tarea aparentemente
9797+tan sencilla: en lugar de comparar <code>a</code> y <code>b</code> como <a href="http://es.wikipedia.org/wiki/N%C3%BAmero_real">números
9898+reales</a>, podemos concebirlos como pasos
9999+discretos y definir el margen de error como el número máximo de valores de punto flotante
100100+posibles entre esos dos números.</p>
821018383-<p>This is conceptually very clear and easy and has the advantage of implicitly scaling the relative error margin with the magnitude of the values. Technically, it’s a bit more complex, but not as much as you might think, because IEEE 754 floats are designed to maintain their order when their bit patterns are interpreted as integers.</p>
102102+<p>Esto es conceptualmente muy evidente y fácil y tiene la ventaja de que escala
103103+implícitamente el margen de error relativo con la magnitud de los valores.
104104+Técnicamente es un poco más complejo, pero no mucho más de lo que puedas pensar,
105105+porque los números del IEEE 754 están diseñados para mantener su orden cuando
106106+sus secuencias de bits se interpretan como enteros.</p>
841078585-<p>However, this method does require the programming language to support conversion between floating-point values and integer bit patterns. Read the <a href="/references/">Comparing floating-point numbers</a> paper for more details.</p>
108108+<p>Sin embargo, este método requiere que el lenguaje de programación soporte conversión
109109+entre valores de punto flotante y secuencias de bits enteras. Lee el artículo en
110110+inglés <a href="/references/">Comparing floating-point numbers</a> para más detalles.</p>
8611187112 <g:plusone href="http://puntoflotante.org/"></g:plusone>
88113 <div id="license">
+19-23
errors/propagation/index.html
···22<html lang="es">
33 <head>
44 <meta charset="utf-8">
55- <title>La Guía del Punto Flotante - Error Propagation</title>
55+ <title>La Guía del Punto Flotante - Propagación del error</title>
6677 <meta name="generator" content="nanoc 3.1.2">
8899- <meta name="Description" content="Explanations about propagation of errors in floating-point math.">
99+ <meta name="Description" content="Explicaciones sobre la propagación de errores en aritmética de punto flotante">
10101111 <link rel="stylesheet" type="text/css" href="/style.css" media="screen">
1212 <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">
···1414 </head>
1515 <body>
1616 <div id="main">
1717- <h1>Error Propagation</h1>
1818- <p>While the errors in single <a href="/formats/fp/">floating-point numbers</a> are very small, even simple calculations on them
1919-can contain pitfalls that increase the error in the result way beyond just having the individual
2020-errors “add up”.</p>
1717+ <h1>Propagación del error</h1>
1818+ <p>Aunque los errores en <a href="/formats/fp/">números de punto flotante</a> aislados son muy pequeños,
1919+operaciones simples con ellos pueden tener problemas e incrementar el error del resultado
2020+más de lo que se esperaría «sumando» los errores individuales.</p>
21212222-<p>In general:</p>
2222+<p>En general:</p>
23232424<ul>
2525- <li>Multiplication and division are “safe” operations</li>
2626- <li>Addition and subtraction are dangerous, because when numbers of different magnitudes are involved,
2727-digits of the smaller-magnitude number are lost.</li>
2828- <li>This loss of digits can be inevitable and benign (when the lost digits also insignificant for
2929-the final result) or catastrophic (when the loss is magnified and distorts the result strongly).</li>
3030- <li>The more calculations are done (especially when they form an iterative algorithm) the more important
3131-it is to consider this kind of problem.</li>
3232- <li>A method of calculation can be <em>stable</em> (meaning that it tends to reduce rounding errors)
3333-or <em>unstable</em> (meaning that rounding errors are magnified). Very often, there are both stable
3434-and unstable solutions for a problem.</li>
2525+ <li>La multiplicación y la división son operaciones «seguras».</li>
2626+ <li>La suma y la resta son peligrosas, porque cuando hay involucrados números de diferentes órdenes de magnitud, los dígitos del más pequeño se pierden.</li>
2727+ <li>Esta pérdida de dígitos puede ser inevitable y benigna (cuando los dígitos perdidos son también insignificantes para el resultado final) o catastrófica (cuando la pérdida se amplifica y distorsiona el resultado fuertemente).</li>
2828+ <li>Cuantas más operaciones se hagan (especialmente cuando forman parte de un algoritmo iterativo) más importante es considerar este problema.</li>
2929+ <li>Un método de cálculo puede ser <em>estable</em> (tiende a reducir los errores de redondeo) o <em>inestable</em> (los errores de redondeo se amplifican). A menudo, hay soluciones estables e inestables a un problema.</li>
3530</ul>
36313737-<p>There is an entire sub-field of mathematics (in <a href="http://en.wikipedia.org/wiki/Numerical_analysis">numerical analysis</a>) devoted to studying the numerical stability
3838-of algorithms. For doing complex calculations involving floating-point numbers, it is absolutely
3939-necessary to have some understanding of this discipline.</p>
3232+<p>Hay un área entera de las matemáticas (el <a href="http://es.wikipedia.org/wiki/An%C3%A1lisis_num%C3%A9rico">análisis
3333+numérico</a>) dedicada a estudiar la
3434+estabilidad numérica de los algoritmos. Para hacer cálculos complejos utilizando números de punto
3535+flotante, es absolutamente necesario tener ciertos conocimientos en esta materia.</p>
40364141-<p>The article <a href="/references/">What Every Computer Scientist Should Know About Floating-Point Arithmetic</a> gives a detailed introduction,
4242-and served as an inspiration for creating this website, mainly due to being a bit too detailed and
4343-intimidating to programmers without a scientific background.</p>
3737+<p>Este artículo en inglés <a href="/references/">What Every Computer Scientist Should Know About Floating-Point Arithmetic</a>
3838+da una introducción detallada, y sirvió de inspiración para esta web, principalmente por el hecho
3939+de que era demasiado minucioso y un poco intimidante para programadores sin una formación científica.</p>
44404541 <g:plusone href="http://puntoflotante.org/"></g:plusone>
4642 <div id="license">