{"id":3009,"date":"2021-10-17T22:25:43","date_gmt":"2021-10-18T01:25:43","guid":{"rendered":"https:\/\/www.geekosas.com\/?p=3009"},"modified":"2021-10-17T22:25:43","modified_gmt":"2021-10-18T01:25:43","slug":"hasta-cuanto-sabe-contar-el-ordenador","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2021\/10\/17\/hasta-cuanto-sabe-contar-el-ordenador\/","title":{"rendered":"Hasta Cuanto sabe contar el Ordenador?"},"content":{"rendered":"<p>Mi hijo de 2 a\u00f1os sabe contar hasta 10, despues comienza a &quot;improvisar&quot;, por lo que puedo decir que sabe contar hasta 10.<br \/>\nEn el computador es similar, sumas repetidas veces 1 a un n\u00famero, eventualmente el pc se equivocar\u00e1, si, el computador se puede equivocar, de hecho existe toda una ciencia dedicada a acotar errores en los calculos del PC, llamada error num\u00e9rico.<\/p>\n<p>Para entender como se puede equivocar un computador, primero tenemos que diferenciar como este entiende los n\u00fameros, para ellos existen 2 formas, los Integer (enteros) y los float (decimales o punto flotante), como todos los datos de un PC, ambos son almacenados como secuencias de bit, (0 o 1) y estos difieren en como se interpretan los bits.<\/p>\n<p>Para el primer caso (integer) es bastante simple, pero nos ayudar\u00e1 a entender los tipo float.<\/p>\n<h4>integer<\/h4>\n<p>Los integer vienen en distintos tama\u00f1os dependiendo del numero de bits que se utilizan para almacenarlos, por ejemplo un integer de 4 bits escribir\u00e1 los n\u00fameros del siguiente modo:<\/p>\n<blockquote>\n<p>0=0000<br \/>\n1=0001<br \/>\n2=0010<br \/>\n3=0011<br \/>\n4=0100<br \/>\n5=0101<br \/>\n6=0110<br \/>\n7=0111<\/p>\n<\/blockquote>\n<p>con 4 bits, podemos contar solo hasta 7 por que el ultimo bit es utilizado para denotar el signo del  n\u00famero (positivo o negativo), de este modo, los n\u00fameros negativos se escribir\u00edan del siguiente modo<\/p>\n<blockquote>\n<p>-1=1000<br \/>\n-2=1001<br \/>\n-3=1010<br \/>\n-4=1011<br \/>\n-5=1100<br \/>\n-6=1101<br \/>\n-7=1110<br \/>\n-8=1111<\/p>\n<\/blockquote>\n<p>en general podemos decir que para en un integer de <code class=\"katex-inline\">n<\/code> bits, podemos representar n\u00fameros de hasta <code class=\"katex-inline\">2^{n-1}-1<\/code> para el caso positivo y <code class=\"katex-inline\">2^{n-1}<\/code> para el negativo.<\/p>\n<p>Los integer del pc puede ser de distintos tama\u00f1os, en general de 32, 64 o 128 bits, donde los tama\u00f1os m\u00e1ximos son los siguientes:<\/p>\n<p>32 bit: <code class=\"katex-inline\">2^{31}-1<\/code> = 2.147.483.647<br \/>\n64 bit: <code class=\"katex-inline\">2^{63}-1<\/code> = 9.223.372.036.854.775.807<br \/>\n128 bit: <code class=\"katex-inline\">2^{127}-1<\/code> = 170.141.183.460.469.231.731.687.303.715.884.105.727<\/p>\n<p>Ahora que sucede cuando excedemos este n\u00famero? bueno depende del lenguaje de programaci\u00f3n.<\/p>\n<h5>Python<\/h5>\n<p>Python 3.x es un caso especial, maneja los integer de otro modo, por lo que no tiene limite, esto lo hace considerablemente m\u00e1s lento, pero puede calcularlos tan largos como quiera (al menos eso obtuve en mis resultados).<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; n = (2**1000)\n>&gt;&gt; print(n)\n10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376\n>&gt;&gt; type(n)\n&lt;class &#039;int&#039;&gt;<\/code><\/pre>\n<p>lo anterior es bastante comodo, pero lo hace lento, por eso python tiene la librer\u00eda numpy que trabaja de la forma que funciona nativamente la CPU, obteniendo c\u00e1lculos mas r\u00e1pidos, lo primero que es interesante es que cuando un integer de 32 bits supera su tama\u00f1o m\u00e1ximo, para a ser uno de 64 bits<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; n = np.int32(2**31-1)\n>&gt;&gt; print(n)\n2147483647\n>&gt;&gt; type(n)\n&lt;class &#039;numpy.int32&#039;&gt;\n>&gt;&gt; print(n+1)\n2147483648\n>&gt;&gt; type(n + 1)\n&lt;class &#039;numpy.int64&#039;&gt;<\/code><\/pre>\n<p>si forzamos que n+1 sea de 32 bits el contador comienza desde el n\u00famero mas negativo que se puede representar:<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; np.int32(n + 1)\n-2147483648<\/code><\/pre>\n<p>lo anterior se debe a que en binario 2147483647 = 011111111111111111111111111111111, por lo que al sumar 1, da el resultado 1000000000000000000000000000000, el cual es -2147483648.<\/p>\n<p>por otro lado, el int m\u00e1s grande en numpy es de 64 bits, \u00bfque har\u00e1 si no puede aumentar su tama\u00f1o?,\u00bfpasar\u00e1 a otro tipo de integer de mayor capacidad o comenzar\u00e1 desde el negativo?<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; n = np.int64(2**63-1)\n>&gt;&gt; print(n)\n9223372036854775807\n>&gt;&gt; type(n)\n&lt;class &#039;numpy.int64&#039;&gt;\n>&gt;&gt; print(n+1)\n-9223372036854775808\n>&gt;&gt; type(n + 1)\n&lt;class &#039;numpy.int64&#039;&gt;<\/code><\/pre>\n<p>claramente comienza desde el negativo por que el integer m\u00e1s grante que est\u00e1 implementado en numpy es el de 64 bits.<\/p>\n<h5>R<\/h5>\n<p>En R los enteros son por defecto de 32 bits, existen librerias para trabajar enteros de 64 bits, pero no son nativos. podemos ver que R avisar\u00e1 que se super\u00f3 el m\u00e1ximo, por lo que podemos estar tranquilos de que no habr\u00e1n comportamientos extra\u00f1os.<\/p>\n<pre><code class=\"language-R\">> n = 2147483647L\n> n+1L\n[1] NA\nWarning message:\nIn n + 1L : NAs produced by integer overflow<\/code><\/pre>\n<h5>Julia<\/h5>\n<p>Julia comete el mismo error de python, sin avisar que cometer\u00e1 un error.<\/p>\n<pre><code class=\"language-julia\">julia&gt; n = Int32(2147483647)\n2147483647\n\njulia&gt; n + Int32(1)\n-2147483648<\/code><\/pre>\n<p>por ultimo Juia puede manejar enteros de hasta 128 bits, permitiendoles contar hasta:  170.141.183.460.469.231.731.687.303.715.884.105.727, ;uego de eso, volver\u00e1 al negativo.<\/p>\n<h4>Floats o punto flotante<\/h4>\n<p>El general el PC usa floats en vez de integers, pero la explicaci\u00f3n anterior sirve como ayuda para entender este caso.<\/p>\n<p>Ac\u00e1 se pone un poco mas compleja la cosa, imagina que tienes un n\u00famero muy muy largo, no tiene mucho sentido utilizar todos lo digitos, solo los ultimos ser\u00e1n los significativos o relevantes, por eso existe la notaci\u00f3n cientifica, donde por ejemplo: 123.456.789.012.345.678.901.234.567.890 se escribir como <code class=\"katex-inline\">1,23456 * 10^{29}<\/code>, descartando los n\u00fameros no significativos, lo mismo hace el PC para almacenar n\u00fameros tipo float pero en binario.<\/p>\n<p>En general el pc usa floats de 64 bitts llamados doubles, pero para este ejercicio lo haremos con floats de 32 bits o single. En un float de 32 bits, de los 32 bits, 24 se utilizan para escribir los d\u00edgitos significativos, mientras que los 8 restantes se utilizan para el exponente de la notaci\u00f3n cient\u00edfica.<\/p>\n<p>Teoricamente, el n\u00famero m\u00e1s grande que puede almacenar un float de 32 bits es del orden de <code class=\"katex-inline\">2^{2^{7}-1} = 2^{127} \\sim 10^{38}<\/code>, pero la pregunta no es cual es el n\u00famero m\u00e1s grande, es hasta cuanto puede contar el PC.<\/p>\n<p>Cuando cotamos vamos sumando 1 a un n\u00famero hasta que ya no sabemos calcular el n\u00famero siguiente. \u00bfEn que momento al sumar 1 a un float, entregar\u00e1 un resultado erroneo?<\/p>\n<p>Respondamos a la pregunta usando Julia que tiene un excelente manejo de tipos de datos, para ello, contaremos desde 0 en integer de 64 bitsy float de 32, cuando estos en alguna suma arrojen resultado distintos, significa que el float se equivoco, por lo que no puede contar m\u00e1s.<\/p>\n<p>Esto se debe a que la suma de 1 a un n\u00famero muy grande termina siendo no significativa.<\/p>\n<pre><code class=\"language-julia\">julia&gt; float = Float32(0)\n0.0f0\n\njulia&gt; int = Int64(0)\n0\n\njulia&gt; while int == float\n           float = float + 1\n           int = int + 1\n       end\n\njulia&gt; Int64(float)\n16777216\n\njulia&gt; int\n16777217<\/code><\/pre>\n<p>exactamente en 16.777.216 al sumar 1, el 1 es tan insignificante que el resultado de la suma sera el mismo n\u00famero anterior, por lo que dejar\u00e1 de contar quedandose pegado en: 16.777.216.<\/p>\n<p>en python es la misma historia (pero demora muuuucho tiempo):<\/p>\n<pre><code class=\"language-python\">>&gt;&gt; i = np.int64(0)\n>&gt;&gt; f = np.float32(0)\n>&gt;&gt; while i == f:\n...   i = i + np.int64(1)\n...   f = f + np.float32(1)\n... \n>&gt;&gt; print(i)\n16777217\n>&gt;&gt; print(f)\n16777216.0<\/code><\/pre>\n<p>este n\u00famero 16.777.216 corresponde a <code class=\"katex-inline\">2^24<\/code>, donde justamente 24 es la cantidad de bit utilizados para almacenar las cifras significativas.<\/p>\n<p>No se ve como un n\u00famero t\u00e1n grande, pero el pc en verdad utiliza floats de doble presici\u00f3n, osea de 64 bits, los cuales usan 12 bits para el exponente y 56 para las cigras significativas, por lo que extrapolando este experimento el n\u00famero m\u00e1s grande ser\u00eda <code>$$ 2^52$$ = 4.503.599.627.370.495<\/code><\/p>\n<p>Que sudecer\u00e1 en excel al sumar 1 a ese n\u00famero?<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2021\/10\/image-1634520143885.png?ssl=1\" alt=\"file\" \/><\/p>\n<p>bueno, podemos ver que Excel se equivic\u00f3, asi que ten cuidado se te pones a contar trigo para adquirir la licencia del ajedr\u00e9z, por que con Excel no podr\u00e1s contar la cantidad de granos que necesitaras. (si no entendiste el chiste, puedes ver este video: <a href=\"https:\/\/www.youtube.com\/watch?v=ziWYaYjJ8zk\">https:\/\/www.youtube.com\/watch?v=ziWYaYjJ8zk<\/a>)<\/p>\n<p>Saludos, espero que les haya gustado.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Mi hijo de 2 a\u00f1os sabe contar hasta 10, despues comienza a &quot;improvisar&quot;, por lo que puedo decir que sabe contar hasta 10. En el <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2021\/10\/17\/hasta-cuanto-sabe-contar-el-ordenador\/\" title=\"Hasta Cuanto sabe contar el Ordenador?\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":3011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-3009","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/10\/vocab-10256-counting.jpg?fit=800%2C460&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-Mx","jetpack-related-posts":[{"id":65,"url":"https:\/\/geekosas.com\/index.php\/es\/2015\/02\/01\/receptor-inalambico-de-musica\/","url_meta":{"origin":3009,"position":0},"title":"Receptor Inalambico de M\u00fasica","author":"Daniel Fischer","date":"2015-02-01","format":false,"excerpt":"El fin de este blog siempre ha sido ense\u00f1ar sobre mis variados inventos Geek, gadgets que me compro, trucos para sacarle m\u00e1ximo provecho a alguna tecnolog\u00eda o simplemente ense\u00f1arles sobre algo que pocos saben como: como elegir una bicicleta o como se leen\u00a0las especificaciones de un aud\u00edfono, pero esas son\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2015\/01\/descarga-300x298.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":23,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/12\/sobre-linux\/","url_meta":{"origin":3009,"position":1},"title":"Sobre Linux","author":"Daniel Fischer","date":"2016-04-12","format":false,"excerpt":"Si un d\u00eda por la ma\u00f1ana, despiertas con la inspiraci\u00f3n de descubrir algo nuevo y pones en wikipedia el bot\u00f3n Pagina Aleatorea, con una probabilidad de 1\/1.233.000, caer\u00e1s en el articulo sobre Linux. Si quieres esperar a ese evento, puedes seguir intentando, si no, puedes seguir leyendo este articulo sobre\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/linux.png?fit=387%2C442&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2067,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/03\/27\/que-son-las-redes-neuronales\/","url_meta":{"origin":3009,"position":2},"title":"Que son las redes neuronales?","author":"Daniel Fischer","date":"2016-03-27","format":false,"excerpt":"Muchos han escuchado alguna vez hablar sobre las redes neuronales o la \"inteligencia artificial\" y hemos de ser honestos que cuando alguien utiliza aquellas palabras, suena como todo un Einstein de la computaci\u00f3n sacado de Terminator 2. B\u00e1sicamente, las redes neuronales, se aplican cuando el desarrollador no tiene la m\u00e1s\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":21,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/11\/como-elegir-celular\/","url_meta":{"origin":3009,"position":3},"title":"Como elegir celular?","author":"Daniel Fischer","date":"2016-04-11","format":false,"excerpt":"Pasamos m\u00e1s tiempo con nuestro celular que con nuestra familia, es m\u00e1s, lo usamos para comunicarlos con ella y para muchos es una herramienta fundamental de trabajo. Un celular, quiera admitirlo o no, es un compa\u00f1ero de vida, que seg\u00fan sea la relaci\u00f3n te podr\u00eda acompa\u00f1ar el ba\u00f1o por varios\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/mensagens_amor_namorados_para_celular.jpg?fit=400%2C225&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2639,"url":"https:\/\/geekosas.com\/index.php\/es\/2019\/02\/12\/r-y-pc-superdorerosos\/","url_meta":{"origin":3009,"position":4},"title":"R y PC super-porerosos","author":"Daniel Fischer","date":"2019-02-12","format":false,"excerpt":"R y python est\u00e1n muy de moda \u00faltimamente, pero te haz preguntado si le est\u00e1s sacan totalmente el jugo a esos lenguajes, es m\u00e1s, seguramente para trabajar con ellos tienes un PC super-poderoso, bueno, la verdad es que si est\u00e1s entrando al mundo del Analytics, posiblemente aun no lo est\u00e9s\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/02\/2922898-a.jpg?fit=350%2C350&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2476,"url":"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/12\/que-ve-el-machine-learning\/","url_meta":{"origin":3009,"position":5},"title":"Que ve el machine learning?","author":"Daniel Fischer","date":"2018-08-12","format":false,"excerpt":"Los algoritmos de machine learning logran entender problemas de cientos o a veces miles de dimensiones, logrando as\u00ed ver cosas que el ojo humano no podr\u00eda de otro modo ver, pero... \u00bfcomo se comparan estos m\u00e9todos cuando el ojo humano si puede ver? Por ello generamos una serie de experimentos\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=3009"}],"version-history":[{"count":12,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3009\/revisions"}],"predecessor-version":[{"id":3023,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3009\/revisions\/3023"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/3011"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=3009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=3009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=3009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}