Domanda

Sto avendo un problema con C #. Per la precisione con la Math.pow (). Se provo a calcolare la 15 ^ 14, allora ottengo "29192926025390624". Ma se i miei calcoli con Wolfram Alpha ottengo "29192926025390625". Come si può vedere questa unica differenza è il numero 1. Wolfram Alpha è corretto però. Perché non è C #? e come posso risolvere questo problema in modo da poter ottenere il valore corretto in C #? 7

Il mio codice è abbastanza semplice dato che sto solo cercando di esempi hardcoded. Quindi quello che sto facendo è: Math.Pow(15,14); Questo dà 29192926025390624. E non "29192926025390625", che è la risposta corretta.

Link: Wolfram Alpha

È stato utile?

Soluzione

Math.Pow opera su tipi a virgola mobile, che sono per definizione imprecisa. Se avete bisogno di numeri interi precisione arbitraria, utilizzare una precisione di tipo intero arbitrario come il BigInteger struttura. BigInteger ha anche un metodo Pow .

Altri suggerimenti

Math.pow lavora su doppie. Questa implementazione con lunghi ottiene la risposta corretta:

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

Math.pow lavora su doppie. Doubles sono in virgola mobile a 64 bit e hanno circa 15-16 cifre di precisione in C # , e quindi, ciò che state vedendo è un errore di arrotondamento. E 'così che i numeri in virgola fluttuante lavoro.

Se avete bisogno di più precisione, provare a utilizzare decimale . Esso è di 128 bit e utilizza 10 come base. Questo vi dà rappresentazione accurata di numeri fino a 28-29 cifre significative. Si può facilmente definire il proprio metodo di Pow per decimale.

Se decimal non è sufficiente, rivolgersi a BigInteger , che è stato aggiunto in .NET 4.

Math.pow () sta lavorando correttamente il suo problema con il doppio tipo di dati    vedere questo.

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

ops scusate, controllare il valore per punto di interruzione; nel programma;

C # 's Math.pow restituisce un doppio, un numero a virgola mobile 754 standard IEEE. Ha solo 15 cifre significative:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top