Pregunta

Todos los métodos en System.Math toma double como parámetros y devuelve parámetros. Las constantes son también de tipo double. Revisé MathNet.Numerics , y lo mismo parece ser el caso.

¿Por qué es esto? Especialmente para las constantes. No se decimal supuesta para ser más exactos? no que a menudo ser un poco útil cuando hace cálculos?

¿Fue útil?

Solución

Esta es una operación clásica de velocidad versus exactitud fuera.

Sin embargo, tenga en cuenta que para la PI, por ejemplo, el mayor número de dígitos que necesitará siempre es 41.

  

El mayor número de dígitos de pi   que necesitará siempre es 41. Para   calcular la circunferencia de la   universo con un error menor que el   diámetro de un protón, que necesita 41   † dígitos de pi. Parece seguro   concluir que los 41 dígitos es suficiente   precisión en pi para cualquier círculo   problema de la medición es muy probable que   encuentro. Así, en el más de un   billón de dígitos de pi calculadas en   2002, todos los dígitos más allá de la 41 tienen   ningún valor práctico.

Además, decimal y dobles tienen una estructura de almacenamiento interno ligeramente diferente. Decimales están diseñados para almacenar la base 10 de datos, donde como dobles (y flotadores), se hacen para contener datos binarios. En una máquina binaria (como todos los ordenadores de la existencia) un doble tendrá menos bits desperdiciados al almacenar cualquier número dentro de su gama.

Ten en cuenta también:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Como se puede ver, decimal tiene un rango menor, pero una mayor precisión.

Otros consejos

No, - decimales no son más "exacta" del doble, o para el caso, cualquier tipo. El concepto de " exactitud ", (cuando se habla de representaciones numéricas en un compuiter), es lo que está mal. Cualquier tipo es absolutamente 100% exacta en la representación de algunos los números. bytes sin signo son 100% exacta en la representación de los números enteros de 0 a 255. pero son no es bueno para fracciones o para los negativos o números enteros fuera de la gama.

decimales son 100% exacto a que representa un determinado conjunto de base 10 valores. dobles (ya que almacenan su valor mediante binario representación exponencial IEEE) son exactas a las que representan un conjunto de binario los números . Ninguno de los dos es más exacta que la que el otro, en general, son simplemente para diferentes propósitos.

Para elaborar un poco furthur, ya que me parece que no sea lo suficientemente claro para algunos lectores ...

Si se toma cada número que es representable como un decimal, y marcar cada uno de ellos en una recta numérica, entre los todos par adyacente de ellos hay un adicional infinito de los números reales que son no representable como un decimal. La misma declaración exacta se puede hacer acerca de los números que pueden ser representados como una doble. Si marcó todos los decimales en la recta numérica en azul, y cada doble en rojo, a excepción de los números enteros, habría muy pocos lugares donde el mismo valor fue marcado en ambos colores. En general, para 99,99999% de las marcas, (por favor no nitpick mi porcentaje) del conjunto azul (decimales) es un conjunto completamente diferente de números del conjunto rojo (los dobles).

Esto se debe a que por nuestra propia definición para el conjunto azul es que se trata de una representación de base 10 mantisa / exponente, y un doble es una representación / 2 exponente mantisa base. Cualquier valor representado como base 2 mantisa y exponente, (1.00110101001 x 2 ^ (-11101001101001) significa tomar el valor de la mantisa (1.00110101001) y se multiplica por 2 elevado a la potencia del exponente (cuando exponente es negativo esto es equivilent a dividir por 2 a la potencia del valor absoluto del exponente). Esto significa que cuando el exponente es negativo, (o donde cualquier porción de la mantisa es un binario fraccional) el número no puede ser representado como una mantisa decimal y exponente, y viceversa.

Para cualquier número real arbitrario, que cae al azar en la recta numérica real, o bien estar más cerca de uno de los decimales azules, oa uno de los dobles de color rojo.

decimal es más precisa pero tiene menos de un rango. en general, se usaría doble para la física y cálculos matemáticos, sino que utilizaría decimal para los cálculos financieros y monetarios.

Vea los artículos siguientes en MSDN para obtener más información.

Doble http://msdn.microsoft.com/en-us/library/678hzkk9. aspx

decimal http://msdn.microsoft.com/en-us/library/364x0z75. aspx

Parece que la mayor parte de los argumentos aquí a "no hace lo que yo quiero" son "pero es más rápido", así también lo es la biblioteca ANSI C + Gmp, pero nadie defiende ese derecho?

Si desea controlar particular exactitud, entonces hay otros idiomas que han tomado el tiempo para poner en práctica una precisión exacta, de una manera controlable por el usuario:

http://www.doughellmann.com/PyMOTW/decimal/

Si la precisión es muy importante para usted, entonces usted está probablemente mejor utilizando lenguajes matemáticos que usarían. Si no te gusta entonces Fortran Python es una alternativa moderna.

Sea cual sea el idioma que se está trabajando, recuerde la regla de oro:  Evitar tipos de mezcla ...  Así que convertir a y b para ser el mismo antes de intentar un operador de b

Si tuviera que aventurar una conjetura, diría que esas funciones, aproveche la funcionalidad de bajo nivel de matemáticas (tal vez en C) que no utiliza decimales internamente, y así devolver un decimal requeriría un molde de doble a decimal de todos modos. Además, el propósito del tipo de valor decimal es para asegurar la exactitud; estas funciones no lo hacen y pueden no 100% de retorno resultados precisos sin precisión infinita (por ejemplo, números irracionales).

Ni decimal ni flotar o doble son lo suficientemente bueno si necesita algo para ser precisos. Por otra parte, decimal es tan caro y usado en exceso por ahí se está convirtiendo en una broma regular.

Si trabaja en fracciones y requiere la máxima precisión, utilizar fracciones. Es misma regla de edad, convertir una vez y sólo cuando sea necesario. Sus reglas de redondeo también van a variar según la aplicación, dominio y así sucesivamente, pero seguro que pueden encontrar un ejemplo par o dos donde es adecuado. Pero, de nuevo, si quieres fracciones y la máxima precisión, la respuesta no es otra cosa que usar fracciones. Tenga en cuenta que puede ser que quiera una característica de precisión arbitraria también.

El problema real con el CLR, en general, es que es tan extraño y sencillo roto para implementar una biblioteca que se ocupa de los valores numéricos en forma genérica en gran medida por su diseño primitivo y deficiencia del compilador más popular para la plataforma. Es casi lo mismo que con el fracaso de Java.

doble simplemente resulta ser el mejor compromiso que cubre la mayoría de los dominios, y funciona bien, a pesar del hecho de MS JIT es todavía incapaz de utilizar una tecnología de CPU que es de unos 15 años de edad ahora.

[pieza a los usuarios de los compiladores de desaceleración MSDN]

Doble es un tipo incorporado. Es el apoyo de la FPU / SSE núcleo (anteriormente conocido como "coprocesador matemático"), es por eso que es increíblemente rápido. Especialmente por la multiplicación y funciones científicas.

decimal es en realidad una estructura compleja, que consta de varios números enteros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top