Pregunta

Estoy teniendo un problema con C #. Para ser precisos con el Math.pow (). Si intento para calcular 15 ^ 14 Entonces consigo "29192926025390624". Pero si puedo calcular con Wolfram Alpha consigo "29192926025390625". Como se puede ver esta única diferencia es el número 1. Wolfram Alpha es sin embargo correcto. ¿Por qué no es C #? y ¿cómo puedo solucionar esto para que pueda obtener el valor correcto en C #? 7

Mi código es bastante simple ya que sólo estoy tratando con ejemplos codificado. Así que lo que estoy haciendo es: Math.Pow(15,14); Esto da 29192926025390624. Y no "29192926025390625", que es la respuesta correcta.

Enlaces: Wolfram Alpha

¿Fue útil?

Solución

Math.Pow opera sobre los tipos de punto flotante, que son por definición inexacta. Si necesita enteros de precisión arbitraria, utilice una precisión de tipo entero arbitrario como el estructura BigInteger . BigInteger también tiene un método Pow .

Otros consejos

Math.pow trabaja en dobles. Esta aplicación con la larga se obtiene la respuesta correcta:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));

Math.pow trabaja en dobles. dobles son de coma flotante de 64 bits y tienen aproximadamente 15-16 dígitos de precisión en C # , y por lo tanto, lo que está viendo es un error de redondeo. Así es como números de punto flotante de trabajo.

Si necesita más precisión, trate de usar decimal . Es de 128 bits y utiliza 10 como la base. Esto le da una representación exacta de los números hasta el 28-29 dígitos significativos. Se puede definir fácilmente su propio método para Pow decimal.

Si decimal no es suficiente, a su vez BigInteger , que se añadió en .NET 4.

Math.pow () está trabajando correctamente su problema con el tipo de datos doble    ver esto.

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

Vaya Lo sentimos, Registro de valor por punto de interrupción; en su programa;

C # 's Math.pow devuelve un doble, un número de coma flotante IEEE 754 estándar. Sólo tiene 15 dígitos significativos:

http://msdn.microsoft.com/en- es / library / system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

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