El repositorio de la calculadora de Windows ha sido el proyecto más popular durante todo el mes en GitHub, desde que a principios de marzo, Microsoft decidió liberarlo
Es así como un grupo de desarrolladores ya ha encontrado un número significativo de fragmentos de código sospechoso y bugs en la simple herramienta, desde fugas de memoria, a información que envía la calculadora a los servidores de Microsoft.
Microsoft hace chapuzas hasta en la calculadora.
No me quiero imaginar la mierda que debe de tener Windows escondida. Van a faltar palomitas en el Universo si liberan algún día el código de Millennium.
Entiendo que es un programa conocido por todos y que será relativamente simple. Para aprender programación para Windows con un ejemplo real me parece perfecto.
#13 A ver si no meto la pata, porque solo lo use un par de veces hace mil años, pero creo recordar que una vez dentro de la calculadora abrías la ayuda y desde allí era donde te dejaba. Si hay alguien que se acuerde bien que me corrija si me equivoco.
#15 en 32 o 64 bits no puedes representar todos los decimales posibles porque los decimales son infinitos.
Un float es una representación de un número decimal mediante un signo, una mantisa y un exponente, empaquetados en 32 o 64 bits (float o double).
Los números decimales que tu ves "redondos", como 1.0, internamente tienen que ser representados así, de forma que en realidad un cálculo que "debería" darte 1.0 te da 0.99999999999, pero no 1.0
El resultado práctico es que nunca se comparan dos floats entre sí directamente al menos que realmente quieras saber que ambos tienen la misma representación binaria.
Para todo lo demás has de comparar teniendo en cuenta epsilon, que es el mínimo número representable en tu implementación de flotantes, generalmente una constante (en C++: en.cppreference.com/w/cpp/types/numeric_limits/epsilon)
Algunos lenguajes de programación hacen eso por ti automáticamente, pero la calculadora de Windows está programada en una variante de C++ de Microsoft y requiere llamar explícitamente a alguna función que compare teniendo en cuenta epsilon si es lo que deseas. C++ es un lenguaje muy explicito para el programador.
Además de todo eso, de raíz es mala idea usar flotantes para una calculadora. Los flotantes son muy rápidos, pero una persona no hace millones de operaciones por segundo con una calculadora. Por tanto es un caso muy claro para usar no flotantes sino números decimales de precisión arbitraria.
Son más lentos, pero permiten infinitos decimales y permiten cualquier tipo de operación.
Hoy en día hay muchas librerías para eso en C++, compiladores como gcc las traen integradas.
Un ejemplo hermoso de calculadora de precisión arbitraria es "bc".
Es en línea de comandos, pero puede hacer cualquier operación.
#3 No es simple. Es de Microsoft. Hay pocas oportunidades de mirar el código que hace Microsoft así que cuando se filtra algo (o lo liberan como ahora) y la gente está encantada de sacar listas de chapuzas. Y de hecho esta calculadora no solo tiene chapuzas y errores de principiante sino que a demás espía al usuario y manda información a los servidores de Microsoft.
Si una simple calculadora es así imagina lo que serán proyectos millones de veces más complejos como Office.
#34 Esa parte de la noticia es un poco sensacionalista, para dar a entender que espiaba. Pero no es tan así.
Se ha encontrado un fragmento de código que "podría" enviar el contenido que se copia en la calculadora, pero indagando un poco, se ve que ese fragmento se utiliza solamente para depurar el código (algo que hace durante el desarrollo para investigar porqué algo está fallando), y en ningún momento envía información a los servidores de MS, como quiere hacer entender la noticia.
#11 Habla de la "seguridad" de Windows. Las restricciones en Windows siempre han sido a alto nivel, o sea que si el administrador decía que no podías navegar por internet, Explorer te daba error pero abrías la ayuda de la calculadora y resulta que era un navegador que te dejaba hacer cualquier cosa.
El problema de base es que Windows nunca fue diseñado como un sistema con restricciones. Se han ido agregando pero al no estar en la base sino sólo por encima, siguen saliendo problemas de este estilo.
#15 Es una de esas antiguas "máximas" de la programación: "no compartas por igual dos float".
La gracia de esta máxima es que la mayoría cuando éramos principiantes cometimos ese error y nos trajo de cabeza hasta que aprendimos la lección de la manera difícil.
La explicación es simple: a no ser que copies el valor de un float a otro, difícilmente dos números "iguales" se representen igual en memoria. Siempre habrá una diferencia en algún bit aunque al mostrarlo en pantalla con una cantidad de decimales "legible" se vean iguales.
La solución es en lugar de compararlos, restarlos y comparar el resultado con un número muy pequeño.
#11 Creo que #7 se refiere a cuando estaba XP capado en modo kiosko o así y no tenias acceso al menú de inicio ni nada, que arrancabas la calculadora y desde ella lanzabas programas "bloqueados"
#2 Si te digo que tuve que crear una regla específica en el cortafuegos (no el de Windows, claro) porque el proceso "explorer.exe" está en contacto constante con uno de los servidores de telemetría de Microsoft. Y que si abres casi cualquier librería del S.O Windows, y buscas la palabra telemetría en inglés, aparece como mínimo una vez, demostrando que está incrustada en cada librería, pues...
Esto sin añadir la chapuza de Windows Update y sus infinitas reiteraciones para descargar archivos que fallan, lo que provoca un uso de la CPU de manera anormal, en mi ordenador del 6-11%, pero en un ordenador de gama media o baja, no me lo quiero ni imaginar. Lo cual lo desactivé, porque tampoco lo necesito, ya que el WSUS Offline Update, el programa que uso, activa el servicio solo cuando lo necesita.
#15 imagino que se refiere a la pérdida de precisión tras realizar operaciones de coma flotante.
Sin dar más contexto y afirmar eso, la verdad que chirría un poco. Si realmente fuera una burrada, el lenguaje nunca te permitiría hacerlo, y obviamente todos los lenguajes te lo permiten.
De todas formas, el uso de floats/doubles no tiene porqué ser malo dependiendo del contexto, no son criminales, solo tienen sus limitaciones. Si necesitas precisión a nivel monetario u operaciones que necesitan exactitud, obviamente no te vale usar doubles, lo recomendable es recurrir a clases especializadas que te de tu lenguaje: BigDecimal en Java, Decimal en Python,...
En este caso concreto de la calculadora, sinceramente, no se cuanto uso le darán como calculadora científica, ni si por debajo realmente usa floats/doubles (el repo simplemente lo ojee por encima). En mi caso poco la uso, más que nada para hacer operaciones básicas o para pasar a hexadecimal/binario.
#2 la parte de mandar informacion a los servidores de microsoft es simple, la calculadora incluye conversion de monedas, eso necesita mandar datos si o si.
#16 Por otro lado, quien usara la calculadora de Windows para hacer cálculos que requirieran una máxima precisión hasta el punto de no querer errores al comparar dos floats...
La burrada sería confiar ese sencillo programa para que te clave resultados en operaciones matemáticas importantes.
Para el uso que le dábamos la gente de a pié, el posible error era inapreciable.
#21 Mirando la biblioteca decimal de Python he entendido algo así. Gracias por la explicación. Así, que realmente hacer la comparación de igualdad sería una absurdez porque nunca se cumpliría, es decir nunca serán iguales, por lo que dices y por lo que he visto biblioteca decimal de Python, donde decimal si que representa con exactitud los valores y Float no.
El titular es un poco sensacionalista no? La calculadora solo tiene unas 30.000 estrellas mientras que proyectos como vue tienen más de 130.000, no se.
Microsoft hace chapuzas hasta en la calculadora.
No me quiero imaginar la mierda que debe de tener Windows escondida. Van a faltar palomitas en el Universo si liberan algún día el código de Millennium.
Un float es una representación de un número decimal mediante un signo, una mantisa y un exponente, empaquetados en 32 o 64 bits (float o double).
Los números decimales que tu ves "redondos", como 1.0, internamente tienen que ser representados así, de forma que en realidad un cálculo que "debería" darte 1.0 te da 0.99999999999, pero no 1.0
El resultado práctico es que nunca se comparan dos floats entre sí directamente al menos que realmente quieras saber que ambos tienen la misma representación binaria.
Para todo lo demás has de comparar teniendo en cuenta epsilon, que es el mínimo número representable en tu implementación de flotantes, generalmente una constante (en C++:
en.cppreference.com/w/cpp/types/numeric_limits/epsilon)
Algunos lenguajes de programación hacen eso por ti automáticamente, pero la calculadora de Windows está programada en una variante de C++ de Microsoft y requiere llamar explícitamente a alguna función que compare teniendo en cuenta epsilon si es lo que deseas. C++ es un lenguaje muy explicito para el programador.
Además de todo eso, de raíz es mala idea usar flotantes para una calculadora. Los flotantes son muy rápidos, pero una persona no hace millones de operaciones por segundo con una calculadora. Por tanto es un caso muy claro para usar no flotantes sino números decimales de precisión arbitraria.
Son más lentos, pero permiten infinitos decimales y permiten cualquier tipo de operación.
Hoy en día hay muchas librerías para eso en C++, compiladores como gcc las traen integradas.
Un ejemplo hermoso de calculadora de precisión arbitraria es "bc".
Es en línea de comandos, pero puede hacer cualquier operación.
Si una simple calculadora es así imagina lo que serán proyectos millones de veces más complejos como Office.
Por eso es tan popular.
Se ha encontrado un fragmento de código que "podría" enviar el contenido que se copia en la calculadora, pero indagando un poco, se ve que ese fragmento se utiliza solamente para depurar el código (algo que hace durante el desarrollo para investigar porqué algo está fallando), y en ningún momento envía información a los servidores de MS, como quiere hacer entender la noticia.
El problema de base es que Windows nunca fue diseñado como un sistema con restricciones. Se han ido agregando pero al no estar en la base sino sólo por encima, siguen saliendo problemas de este estilo.
La gracia de esta máxima es que la mayoría cuando éramos principiantes cometimos ese error y nos trajo de cabeza hasta que aprendimos la lección de la manera difícil.
La explicación es simple: a no ser que copies el valor de un float a otro, difícilmente dos números "iguales" se representen igual en memoria. Siempre habrá una diferencia en algún bit aunque al mostrarlo en pantalla con una cantidad de decimales "legible" se vean iguales.
La solución es en lugar de compararlos, restarlos y comparar el resultado con un número muy pequeño.
Esto sin añadir la chapuza de Windows Update y sus infinitas reiteraciones para descargar archivos que fallan, lo que provoca un uso de la CPU de manera anormal, en mi ordenador del 6-11%, pero en un ordenador de gama media o baja, no me lo quiero ni imaginar. Lo cual lo desactivé, porque tampoco lo necesito, ya que el WSUS Offline Update, el programa que uso, activa el servicio solo cuando lo necesita.
Salu2
Sin dar más contexto y afirmar eso, la verdad que chirría un poco. Si realmente fuera una burrada, el lenguaje nunca te permitiría hacerlo, y obviamente todos los lenguajes te lo permiten.
De todas formas, el uso de floats/doubles no tiene porqué ser malo dependiendo del contexto, no son criminales, solo tienen sus limitaciones. Si necesitas precisión a nivel monetario u operaciones que necesitan exactitud, obviamente no te vale usar doubles, lo recomendable es recurrir a clases especializadas que te de tu lenguaje: BigDecimal en Java, Decimal en Python,...
En este caso concreto de la calculadora, sinceramente, no se cuanto uso le darán como calculadora científica, ni si por debajo realmente usa floats/doubles (el repo simplemente lo ojee por encima). En mi caso poco la uso, más que nada para hacer operaciones básicas o para pasar a hexadecimal/binario.
Eso dice la RAE...
La burrada sería confiar ese sencillo programa para que te clave resultados en operaciones matemáticas importantes.
Para el uso que le dábamos la gente de a pié, el posible error era inapreciable.