¿Por qué C# acepta la imprecisión mediante el uso de puntos flotantes para almacenar datos?
"C#" no acepta la compensación del rendimiento por encima de la precisión; los usuarios aceptan, o no, eso.
C# tiene tres tipos de punto flotante - flotante, doble y decimal - porque estos tres tipos satisfacen la gran mayoría de las necesidades de los programadores del mundo real.
float y double son buenos para cálculos "científicos" donde una respuesta correcta a tres o cuatro decimales siempre es lo suficientemente cerca, porque esa es la precisión con la que llegó la medida original. Supongamos que divide 10.00 por 3 y obtiene 3.333333333333. Dado que la medición original probablemente solo tenía una precisión de 0.01, el hecho de que el resultado calculado esté desactivado en menos de 0.0000000000004 es irrelevante. En cálculos científicos, no está representando cantidades conocidas para ser exactas. La imprecisión en el decimoquinto lugar decimal es irrelevante si el valor de medición original solo era preciso al segundo decimal.
Esto, por supuesto, no es cierto para los cálculos financieros. Los operandos para un cálculo financiero suelen ser precisos con dos decimales y representan las cantidades exactas. El decimal es bueno para cálculos "financieros" porque los resultados de la operación decimal son exacta, siempre que todas las entradas y salidas se puedan representar exactamente como decimales (y todas están en un rango razonable). Los decimales todavía tienen errores de redondeo, por supuesto, pero las operaciones que son exactas son precisamente aquellas que es probable que quieras ser exacto al hacer los cálculos financieros.
¿Y cuál es la ventaja de usarlo sobre otros métodos?
Debe indicar qué otros métodos le gustaría comparar. Hay muchas técnicas diferentes para realizar cálculos en computadoras.
Por ejemplo, Math.Pow (Math.Sqrt (2), 2) no es exacto en C#. Hay lenguajes de programación que pueden calcularlo exactamente (por ejemplo, Mathematica).
Seamos claros en este punto; Mathematica no "calcula" la raíz 2 exactamente; el número es irracional, por lo que no se puede calcular exactamente en ninguna cantidad finita de almacenamiento. En cambio, lo que hace la matemática es que representa los números como objetos que describen cómo se produjo el número. Si dices "dame la raíz cuadrada de dos", entonces Mathematica esencialmente asigna un objeto que significa "la aplicación del operador de raíz cuadrada al número exacto 2". Si luego lo cuadras, tiene una lógica de propósito especial que dice "si cuadras algo que era la raíz cuadrada de otra cosa, devuelve el valor original". Mathematica también tiene objetos que representan varios números especiales, como pi o e, y un enorme conjunto de reglas sobre cómo se combinan varias manipulaciones de esos números.
Básicamente, es un sistema simbólico; manipula los números de la misma manera que las personas cuando hacen matemáticas de lápiz y papel. La mayoría de los programas de computadora manipulan números como una calculadora: realice el cálculo de inmediato y complételo. Si eso no es aceptable, entonces debes apegarte a un sistema simbólico.
Un argumento que podía pensar es que el cálculo de exactamente es mucho más lento que acaba de hacer frente a la falta de exactitud, pero Mathematica & Matlab se utilizan para calcular los problemas científicos gigantescas, por lo que me resulta difícil de creer que estas lenguas son realmente significativamente más lento que C#.
No es que sean más lentos, aunque la multiplicación de puntos flotantes realmente es increíblemente rápida en hardware moderno. Es que el motor de cálculo simbólico es inmensamente complejo. Codifica todas las reglas de las matemáticas básicas, ¡y hay muchas de esas reglas! C# no pretende ser un motor de cálculo simbólico de nivel profesional, sino un lenguaje de programación de propósito general.
MatLab se ejecuta en un entorno limitado de Java. Si no cree que MatLab es más lento, intente crear un programa en tiempo real en MatLab. He estado allí, hecho eso, no es divertido ... :-) –
Bien, ¿pero Wolfram Mathematica entonces? No pude encontrar puntos de referencia en Internet en comparación con C# –
El [CAS] (http://en.wikipedia.org/wiki/Computer_algebra_system) integrado en la calculadora TI-89 que prácticamente me ayudó a superar los cursos de matemáticas de la universidad. los pantalones fuera de la funcionalidad matemática incorporada en .NET Framework, también. El hecho es que están diseñados para casos de uso totalmente diferentes. –