Menghitung Root ke-n di Java

1. Ikhtisar

Mencoba menemukan root ke-n di Java menggunakan pow () tidak akurat dalam beberapa kasus. Alasannya adalah bahwa angka ganda bisa kehilangan ketepatan dalam perjalanan. Oleh karena itu, kami mungkin perlu memoles hasilnya untuk menangani kasus ini.

2. Masalah

Misalkan kita ingin menghitung akar ke-N sebagai:

base = 125, exponent = 3

Dengan kata lain, pangkat 3 mana yang merupakan 125?

Ini asalkan akar ke-n dari bilangan x sama dengan bilangan x dalam pangkat 1 / n . Jadi kami menerjemahkan persamaan kami menjadi:

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

Hasilnya adalah 4.999999999999999. Dan 4.999999999999999 pangkat 3 bukan 125. Jadi bagaimana kita memperbaikinya?

3. Menghitung Akar N dengan Benar

Solusi untuk masalah di atas sebagian besar adalah solusi matematika, dan sesederhana mungkin. Diketahui bahwa akar ke-n dari bilangan x sama dengan bilangan x dalam pangkat 1 / n .

Ada beberapa cara untuk memanfaatkan persamaan di atas. Pertama, kita dapat menggunakan BigDecimal dan mengimplementasikan versi metode Newton-Raphson kita. Kedua, kita dapat membulatkan hasil ke angka terdekat dan terakhir, kita dapat menentukan margin of error yang hasilnya dapat diterima. Kami akan fokus pada dua pendekatan terakhir.

3.1. Bulat

Kami sekarang akan menggunakan pembulatan untuk menyelesaikan masalah kami. Mari kita gunakan kembali contoh kita sebelumnya dan lihat bagaimana kita bisa mendapatkan hasil yang benar:

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

3.2. Margin of Error

Pendekatan ini sangat mirip dengan di atas. Kami hanya perlu menentukan margin kesalahan yang dapat diterima, misalkan 0,00001:

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

Tes tersebut membuktikan bahwa metode kami menghitung dengan benar root ke-n.

4. Kesimpulan

Sebagai pengembang, kita harus memahami tipe data dan perilakunya. Metode matematika yang dijelaskan di atas bekerja dengan sangat baik dengan akurasi yang cukup baik. Anda dapat memilih salah satu yang lebih sesuai dengan kasus penggunaan Anda. Kode untuk solusi di atas dapat ditemukan di GitHub.