Calcolo dell'ennesima radice in Java

1. Panoramica

Il tentativo di trovare la radice n-esima in Java utilizzando pow () è in alcuni casi impreciso. La ragione di ciò è che i numeri doppi possono perdere precisione durante il percorso. Quindi potremmo aver bisogno di lucidare il risultato per gestire questi casi.

2. Il problema

Supponiamo di voler calcolare la radice N-esima come:

base = 125, exponent = 3

In altre parole, quale numero alla potenza di 3 è 125?

È previsto che la radice n-esima di un numero x sia uguale al numero x nella potenza di 1 / n . Quindi traduciamo la nostra equazione in:

N-th root = Math.pow(125, 1/3)

Il risultato è 4,999999999999999. E 4,999999999999999 alla potenza di 3 non è 125. Quindi come lo aggiustiamo?

3. Calcolo corretto della radice N-esima

La soluzione al problema di cui sopra è principalmente una soluzione matematica, ed è così semplice come sembra. È noto che la radice n-esima di un numero x è uguale al numero x nella potenza di 1 / n .

Ci sono alcuni modi per sfruttare l'equazione di cui sopra. Innanzitutto, possiamo utilizzare un BigDecimal e implementare la nostra versione del metodo Newton-Raphson. In secondo luogo, possiamo arrotondare il risultato al numero più vicino e, infine, possiamo definire un margine di errore in cui i risultati saranno accettabili. Ci concentreremo sugli ultimi due approcci.

3.1. Il giro

Ora useremo l'arrotondamento per risolvere il nostro problema. Riutilizziamo il nostro esempio precedente e vediamo come possiamo ottenere il risultato giusto:

public void whenBaseIs125AndNIs3_thenNthIs5() { double nth = Math.round(Math.pow(125, 1.0 / 3.0)); assertEquals(5, nth, 0); }

3.2. Margine di errore

Questo approccio è molto simile a quello sopra. Abbiamo solo bisogno di definire un margine di errore accettabile, supponiamo 0.00001:

public void whenBaseIs625AndNIs4_thenNthIs5() { double nth = Math.pow(625, 1.0 / 4.0); assertEquals(5, nth, 0.00001); }

Il test dimostra che i nostri metodi calcolano correttamente l'ennesima radice.

4. Conclusione

In qualità di sviluppatori, dobbiamo comprendere i tipi di dati e il loro comportamento. I metodi matematici descritti sopra funzionano davvero bene con una precisione piuttosto buona. Puoi scegliere quello che si adatta meglio al tuo caso d'uso. Il codice per la soluzione sopra può essere trovato su GitHub.