Buscar

CPI (Curioso pero inútil)

En directo en la Red desde 11111010100

  • Busca en CPI

  • APOD

  • Teorema gráfico

  • Cortesía de AoPS

  • Aviso por e-mail

  • Email:
  • HispaCiencia

  • CPI es miembro, a mucha honra, de HispaCiencia.

    Hispaciencia.com
  • Visitantes

  • Mi lista de los deseos

  • My Amazon.com Wish List

 Google calculadora ¿no sabía restar?

3 de febrero de 2006

discount cialis no rx generic viagra online cialis online without prescription cialis pharmacy online cheap cialis no rx compare cialis prices purchase viagra no rx cheap generic cialis buy cialis in us order viagra no prescription order cheap cialis viagra without rx order viagra in canada buy viagra buy generic cialis discount viagra order viagra without prescription viagra in australia cheap cialis from usa cialis pill drug cialis online purchase viagra cost order cialis overnight delivery find cialis buy viagra generic cialis overnight viagra price purchase viagra overnight delivery cheap viagra tablets buy cialis online cialis tablets viagra australia cialis india no rx viagra cialis online cheap cialis online review order viagra from canada buy discount cialis online viagra without a prescription viagra pharmacy online cialis in malaysia lowest price for viagra cialis for order cialis overnight shipping cialis side effects viagra tablet order no rx viagra approved cialis pharmacy discount viagra overnight delivery buy generic cialis online viagra overnight delivery cialis free sample buy viagra lowest price order discount cialis online find cheap viagra purchase viagra without prescription order cheap viagra online cheapest cialis cheap cialis no prescription tablet viagra free cialis order cialis in canada low cost viagra drug viagra online purchase viagra rx price of viagra viagra online stores cheap viagra tablet buy cialis internet buy cialis from canada generic cialis online fda approved viagra viagra no online prescription cialis in us cheap cialis online cheapest viagra price cialis from canada cialis order order cheap cialis online buy cheapest cialis online cialis price generic cialis cheap online pharmacy viagra discount cialis online cialis pills cialis discount cialis drug where to buy viagra best price for cialis cialis buy online buy cheap viagra find discount viagra online certified viagra order cialis no rx viagra without prescription buy cialis from india cheapest viagra viagra drug order viagra on internet cheap cialis internet cialis bangkok buy viagra without prescription viagra online pharmacy cialis malaysia where to order viagra cialis without prescription viagra in malaysia buying viagra order cialis without prescription cheap viagra in canada viagra in us buying generic cialis find no rx cialis cialis rx buy cialis online cheap order viagra overnight delivery viagra prescription cheapest viagra prices viagra no rx required buy cialis on line find discount viagra pharmacy viagra cheap cialis in uk discount viagra no rx cialis viagra pills buy cheap cialis viagra buy online purchase viagra online viagra medication find viagra find viagra without prescription buy no rx viagra cheap cialis without prescription best price cialis viagra tablets cheap viagra overnight delivery buy cialis no rx certified cialis cialis us buy cialis overnight delivery cheap price viagra online viagra buy discount viagra buy viagra internet viagra information viagra us cialis overnight delivery cialis sales cialis no rx required viagra from india viagra online review buying generic viagra find no rx viagra find discount cialis online cheap price cialis cialis cheapest price viagra india viagra no rx cialis cialis no prescription cheap cialis tablets buy cialis cheap viagra pharmacy purchase cialis online buy viagra low price viagra online cialis prescription viagra malaysia buy cialis cheap cheap cialis from uk overnight viagra buy viagra us buy generic viagra online viagra discount discount viagra online cheap cialis drug viagra cialis in australia buy viagra online cheap cialis from india lowest price for cialis pharmacy cialis viagra internet cheapest viagra online order cheap viagra find viagra on internet viagra in bangkok viagra sales cheapest generic cialis online cialis approved compare cialis prices online viagra overnight find cheap cialis online cialis buy where to buy cialis cost viagra best price for viagra buy cialis from us discount cialis overnight delivery order cialis on internet cialis cost buying cialis online sale cialis cheap viagra no prescription viagra buy drug no prescription cialis order viagra no prescription required buy viagra in canada cialis without a prescription order cialis cheap online sale viagra buy viagra in us viagra pharmacy cheapest generic viagra online cialis australia cheap viagra from canada viagra free delivery viagra purchase viagra generic buy no rx cialis viagra from canada lowest price cialis generic cialis buy cheapest viagra find cialis online order viagra from us viagra side effects cheap viagra no rx cheap viagra on internet cheap viagra from uk cialis cheap drug buying cialis buying viagra online cialis internet buy viagra on line order cialis from us cialis online pharmacy viagra online cheap viagra uk buy cheapest viagra on line cheap viagra in usa viagra cheapest price viagra vendors cheap cialis overnight delivery cialis no rx buy discount cialis drug cialis cialis without rx order discount viagra viagra sale order viagra cheap online viagra buy order cialis no prescription viagra free sample viagra no rx buy cheap viagra online tablet cialis cialis medication buy cialis low price viagra cheap generic viagra find cialis without prescription viagra order viagra cheap drug viagra overnight shipping viagra prices buy cialis on internet cheap viagra from usa online cialis cheapest generic viagra cialis vendors generic viagra cheap cialis tablet order cialis online cheap viagra in uk cialis cheap price cheap viagra order viagra in us cialis buy drug cheap viagra without prescription cialis sale cheap cialis pill order discount viagra online buy cialis without prescription cheapest cialis online buy discount viagra online buy generic viagra buy viagra no rx viagra pill buy cialis us cialis in uk buy cheap viagra internet purchase cialis without prescription order discount cialis cheap cialis tablet cialis in bangkok cialis for sale order generic cialis viagra no prescription order cialis in us buy viagra online order cialis compare viagra prices overnight cialis buy viagra overnight delivery find viagra no prescription required cialis prices buy cheap cialis online order viagra viagra for sale buy cheapest viagra online cialis pharmacy buy viagra no prescription required buy cialis in canada buy cialis no prescription required find viagra online cheap cialis pharmacy cialis online stores discount cialis fda approved cialis cheap cialis on internet viagra bangkok viagra canada cost cialis approved viagra pharmacy cialis generic buy viagra on internet buy cialis lowest price buy cheapest cialis on line compare viagra prices online free viagra find cheap cialis online pharmacy cialis viagra in uk buy cheapest cialis low cost cialis order no rx cialis order viagra no rx purchase cialis overnight delivery cialis uk cheap cialis in usa order viagra online find discount cialis find cialis on internet cialis canada lowest price viagra purchase cialis cheapest generic cialis buy viagra from canada cheap generic viagra cheapest cialis prices price of cialis discount viagra without prescription cheap viagra online where to order cialis buy viagra from india purchase cialis no rx cheapest cialis price buy viagra from us cialis cheap cheap cialis in canada cialis no online prescription find cheap viagra online order cialis no prescription required viagra online without prescription viagra cheap price cialis free delivery best price viagra order cialis from canada buy viagra cheap find cialis no prescription required cialis purchase purchase viagra discount cialis without prescription cheap viagra pill cheap cialis from canada viagra approved buy cheap cialis internet cost of cialis cost of viagra cheap viagra internet no prescription viagra cialis information cialis online order generic viagra buy cialis generic viagra for order

Para el que no lo sepa, Google también funciona como calculadora. Si en la casilla de búsqueda introducis “5*9*7″ os responderá 315. Además funciona para unidades de medida “100 lb in kg” (45.35 kilo) e incluso da un cambio de divisas “25 USD in EUR”(unos 20 €, dependiendo del día). Yo lo encuentro muy útil.

A todo esto, recibí un email de Carlos con una referencia de Blackonion en el que me comentaba que Google no sabe restar y me adjuntaba la explicación. Sí queréis hacer la prueba, buscad la siguiente operación 1-0.9-0.1, que en principio debería dar cero, y la respuesta que os dará es:

Cero! En el mes desde que me lo enviaron (he andado muy liado, no he podido publicarlo antes), lo han corregido, pero antes daba un resultado mucho más interesante. Antes respondía -2.77555756*10-17 (el documento de prueba) Obviamente ese resultado no era cero, y se llenaron los blogs de gente diciendo ¡Google no sabe restar! ¡Google falla más que un pentium original! y cosas similares.

Pues bien, resulta que el problema no lo tiene Google, sino muchos otros lenguajes:

# Ruby: 1 - 0.9 - 0.1 = -2.77555756156289e-17
# PHP(4.4): 1 - 0.9 - 0.1 = -2.7755575615629e-17
# JavaScript:1 - 0.9 - 0.1 = -2.7755575615628914e-17
# VbScript: 1 - 0.9 - 0.1 = -2,77555756156289E-17
# Java2: 1 - 0.9 - 0.1 = -2.7755575615628914E-17
# Perl 5: 1 - 0.9 - 0.1 = -2.77555756156289e-017

y todos hacen la operación igual. ¿Porqué?

El standard IEEE 754 (IEEE = Institute of Electrical and Electronics Engineers, los de las Navidades según Remo) es un método de almacenar números en coma flotante compacto y fácil de usar. Lo utiliza Intel y la mayoría de programas para PC. Se guardan los números en formato binario. Y aquí está la clave de la cuestión.

El 1 se almacena exactamente. Pero algunos números que son sencillos en clave decimal como 0.1 no se pueden grabar de manera exacta en binario. Del mismo modo que 1/3 en decimal se convierte en 0.33333…, el número 1/10 (10 en notación decimal, no 10 binario) se convierte en periodico al ser expresado en binario: 0.1 (decimal) = .0001100011000111000111… (binario).

Como pasa con los números periodicos, el ordenador lo recorta al número de bits máximos que usa, y el número se redondea por 2.78E-17 al ser almacenado (yo aquí también he redondeado ;) ).

Así que el ordenador hace el siguiente cálculo en realidad

1 - 0.9 - (0.1 + 2.78E-17) = -2.78E-17

Y ese resultado tiene mucho más sentido. En Ingeniería computacional esto es muy conocido, y por eso se intenta huir al máximo de operaciones de división del estilo A/(B-C), donde B y C pueden ser muy próximos. Si B-C se acerca a cero, surgen problemas de precisión graves en el resultado y el resultado de la división es aún más sensible a estos errores.

Al fin y al cabo, parece un error muy pequeño, ya que 2.78E-17 =0.0000000000000000278 y en la calculadora (o el bolsillo) eso no tiene mayor importancia, y si se redondean los resultados (como hace Google ahora) da un cero perfecto. Pero, de momento, ya ha dado para un post sobre .

* He descubierto que se puede reproducir el error cambiando los numeros:



¡Vota esta entrada! 1 Stars2 Stars3 Stars4 Stars5 Stars

24 Votes | Average: 4.67 out of 524 Votes | Average: 4.67 out of 524 Votes | Average: 4.67 out of 524 Votes | Average: 4.67 out of 524 Votes | Average: 4.67 out of 5 (24 votos, media: 4.67 de 5)

Hay 19 comentarios en “Google calculadora ¿no sabía restar?”

  1. Gravatar Nixz dice:

    También sucede con:

    1000 - 999.9 - 0.1 = 2.27318164 × 10^(-14)

    y de ahí en adelante, se le pueden poner todas las cifras que queráis.

    Como curiosidad, la calculadora que viene con Ubuntu, ‘gcalctool’ (la que viene en el menú), da como resultado -0 (cero negativo). Y la otra calculadora que viene con Ubuntu, ‘xcalc’ (un poco más feílla) comete el mismo error que google… :S da exactamente:

    10 - 9.9 - 0.1 = -3,60822e-16

    En fin, ahí queda eso xD

    Saludos!

    Resta Suma (-1)
  2. Gravatar Agnès dice:

    ¡Qué CPI! :P

    Resta Suma (-1)
  3. Gravatar ^DiAmOnD^ dice:

    Yo escribi hace tiempo sobre el tema, pero los ejemplos que puse en mi post ya están arreglados.

    La verdad es que es muy curioso :P

    Resta Suma (0)
  4. Gravatar cedila dice:

    Es por esto que en un programa de computadora, uno no debe incluir comprobaciones de igualdad entre valores en coma flotante, como en este trocito de programa en C:

    float a = 0.1, b = 1.0, c = 0.9;

    if (a == b - c)
    puts(”¡Funciona! Qué raro”);
    else
    puts(”Ya me lo temía yo.”);

    la comprobación de igualdad

    if (a == b - c)

    fallará seguramente. Lo que se debe hacer es ponerlo de esta otra forma:

    if (fabs(a - (b - c)) < epsilon)

    donde fabs() es una función que devuelve el valor absoluto de un valor en coma flotante y epsilon es “un valor suficientemente pequeño”.

    Es una pena, pero es así. Los números que los computadores pueden manejar normalmente son sólo cierto subconjunto de los enteros y unos cuantos valores racionales, entre los que está el cero. Pero no se pueden representar cantidades con valor absoluto arbitrariamente pequeño ni arbitrariamente grande, y ciertos números racionales que en notación decimal tienen un número finito de cifras decimales, como 1/10, no tienen representación exacta en binario, en los circuitos del computador. Pasa como cuando queremos representar 1/3 en notación decimal, que hay que poner 0,33333… y en alguna parte hay que cortar, con el error de truncamiento correspondiente.

    Lo malo es cuando los errores de redondeo o truncamiento se propagan de cálculo en cálculo, tal vez amplificándose en cada nuevo ciclo de operaciones. Como los computadores pueden tener que hacer millones de operaciones dependientes una de otra para calcular un determinado resultado, hay veces que resulta muy difícil acotar el error.

    Con esas limitaciones aritméticas, la fiabilidad de los resultados dependerá de que los programadores sean conscientes de sus efectos y tomen medidas para paliarlos, pero esto, lamentablemente, no siempre sucede ¡Cualquiera se fía! :-)

    Resta Suma (2)
  5. Gravatar Ger dice:

    A mi lo que me parece triste es que se permitan que el bendito Matlab tenga el mismo fallo … y hay veces, sobre todo en problemas en los que se involucran cantidades enormemente pequeñas, por ejemplo capacidades, donde este error de redondeo puede empezar a ser significativo

    Un saludo
    Grandioso estreno de sección

    Resta Suma (-3)
  6. Gravatar Ger dice:

    Se me ocurre un problema de magnetismo, donde puede aparecer valores de velocidades de la luz elevados a -2 (1.11e-17) ( eso en el mejor de los casos, con epsr = 1 y mur = 1). En este caso, el valor a hallar es menor que el redondeo, si no me equivoco

    Resta Suma (-2)
  7. Gravatar Serlio dice:

    No está directamente relacionado con la entrada, pero ayer descubrí casualmente que el buscador de MSN también soluciona ecuaciones (creo que es a través de Encarta), aunque me parece que sólo lo hace en su versión en inglés :?

    Resta Suma (-2)
  8. Gravatar Remo dice:

    Efectivamente, Serlio:

    Encarta Answers also includes additional search functionality to help you with your homework or other everyday uses .
    • Definitions. Define a word or phrase, such as define lunar eclipse
    • Calculations. Calculate math problems, such as 2*5
    • Equations. Calculate math equations, such as 3x+4=10
    • Conversions. Get common conversions, such as what is 35 degrees Celsius in Fahrenheit

    Pero sólo resuelve ecuaciones polinómicas hata grado tres. Ni exponenciales, ni trigonométricas… Nada útil ;)

    Resta Suma (-5)
  9. Gravatar hairanakh dice:

    jop, Ger… pues yo con el Matlab sufro lo contrario. Como sólo sabe hacer cuentas con números de doble precisión (Double), cada vez que intento jugar con imágenes sufro mucho con la memoria.

    Por cierto, que para evitar esos problemas bastaría con limitar la precisión de las respuestas…

    Resta Suma (-5)
  10. Gravatar Heimy dice:

    Ger: El asunto es que no es un “fallo”. Es algo inherente a la representación de los números en el computador. Lo más que puedes hacer (y algunos lenguajes lo admiten, como Smalltalk), es utilizar tipos que representen números fraccionarios en lugar de decimales, y no convertirlos al valor real hasta el último momento. Pero esto es un poco ineficiente porque los cálculos en flotante los hace una unidad de cálculo del procesador, y las operaciones con fraccionarios los tienes que hacer tú “a mano”.

    Resta Suma (-2)
  11. Gravatar Tronfi dice:

    Acabo de hacer la prueba con Python 2.4 y pasa exactamente lo mismo :)

    Resta Suma (-1)
  12. Gravatar josemi dice:

    Recuerdo haber oido hablar de este tema alla por el año 84 u 85, una de las antiguas “muy interesante especial ordenadores”.

    En aquel momento, en la epoca del Commodore 64 y el Spectrum, cada modelo de BASIC manejaba los numeros como le daba la gana, aunque evidentemente todos tenian el problema.

    Lo peor es que parece que cada generacion tiene que descubrirlo de manera independiente :-)

    Resta Suma (-4)
  13. Gravatar deibyz dice:

    Ay… Qué recuerdos de esos primeros días de programador que ya dejé atrás…

    Como recuerdo volverme loco con los if()… Esas tardes a última hora llenándolo todo de sprintf()… Menos mal que desde hace mucho tiempo solo uso perl y un $#=”%.2f” lo arregla todo :)

    WN21@Deibyz /cygdrive/d$ perl -e ‘print ( 1 - .9 - .1 )’

    -2.77555756156289e-17

    WN21@Deibyz /cygdrive/d$ perl -e ‘$# = “%.2f”; print ( 1 - .9 - .1 )’
    0.00

    También recuerdo una práctica de C++ en la universidad en la que teníamos que definir una clase de float que almacenaba las cantidades en formato decimal (4bit por dígito si no recuerdo mal…). Lo dicho, ¡qué tiempos aquellos! Y qué recuerdos cada vez que un pogramador novel te viene completamente loco con un “bug” de este tipo… :D

    Resta Suma (-1)
  14. Gravatar PseudoGoN dice:

    Esto nos lo explicaron a fondo el primer año de carrera (informática). Como bien dicen, es una consecuencia de la representación en punto flotante (que es similar a la notación científica de toda la vida pero en binario). El caso es que cuando se producen estos errores al principio de los cálculos, al arrastrarlos se pueden formar errores importantes, por lo que la única solución posible es cambiar el orden de los mismos y dejar para el final las restas y las divisiones.

    Por cierto, las divisiones si que traen tela. Mientras que el resto de operaciones, aun siendo en punto flotante, se pueden segmentar en fases, consiguiendo así que, por ejemplo, varias multiplicaciones se hagan simultaneamente (cada multiplicación está en una de las fases en las que la operación se ha segmentado), la división no se segmenta, por lo que por cada división puedes perder decenas de ciclos de reloj. También es verdad que un motivo importante por el que no se divide en suboperaciones es porque se usa más bien poco y no merece la pena gastar más recursos en ella.

    Lo que no se es si en procesadores más avanzados, la han segmentado (por el momento estamos estudiando procesadores bastante sencillos). ¿Alguién lo sabe?

    saludos

    saludos

    Resta Suma (1)
  15. Gravatar javi dice:

    Llevo tiempo siguiendo esta pagina, dando al botón de cpi al azar he llegado aquí, posiblemente esta entrada no sea ni si quiera conocida por la antigüedad de la última, (vamos, que esta entrada esta mas abandonada que el TAV de Cantabria) pero bueno, dejo lo siguiente:

    1 - 0×9 - 0.1 = -8.1

    Si no me equivoco, 0.9=0 y 0.1=0, por lo tanto 1-0-0=1, mis matemáticas creo que no fallan.

    Resta Suma (-2)
  16. Gravatar Remo dice:

    Javi: No entiendo bien tus cálculos. No sé si es que se ha estropeado algo al publicar, pero lo de 0.9=0 no me cuadra…

    Resta Suma (3)
  17. Gravatar javi dice:

    jaja, yo te lo explico, es una demostración más de que la calculadora no sabe realizar operaciones, por eso son operaciones al azar, y puse algo sencillo según se me ocurrió

    Resta Suma (-1)
  18. Gravatar Charlie1 dice:

    Es injusto abusar de la calculadora de google!! Para hacer multplicaciones debemos poner el asterico (*) en vez de la equis (x). Efectivamente javi, si escribes lo que tu pones en la calculadora de google da ese resultado (-8.1),pero google no entiende el simbolo “x” como multiplicacion. Si ponemos esto: 1-0*9-0.1 da el resultado correcto: 0.9. CPI LIFE FOREVER

    Resta Suma (1)
  19. Gravatar Jose Piñeiro dice:

    @PseudoGoN

    Si lo que quieres es velocidad, la mejor forma de dividir es multiplicar.
    Por ejemplo, si en tu programa quries dividir entre 5, lo que debes hacer es multiplicar por 1/5 (es decir 0.2)
    Por tanto “a=b/5″ es mucho mas lento que “a=b*0.2″

    El spectrum, que alguno lo mencinaba, cometia errores por otro motivo. Cuando tenemos poca potencia de calculo, multiplicar y dividir resulta sumamente lento. Para evitar este problema podemos hayar el loagritmos de los dos numeros, sumar los logaritmos y hyar el antilogaritmo. De esa manera hemos multiplicado.
    alog (log(x)+log(y)) = x*y
    alog (log(x)-log(y)) = x/y

    Obtener logaritmos y antilogaritmos es sencillo (solo hay que consultar una tabla). La suma y la resta son operaciones sencillas y rapidas.
    El unico problema es que nuestra precision queda limitada por la cantidad de decimales que tenga nuestra tabla de logaritmos.

    La mejor forma de dividir, ya que

    Resta Suma (1)

¡Deja tu comentario!

You must be logged in to post a comment.