1. Fungsi trigonometri dalam Java

Apabila kami mempelajari pembundaran nombor tadi, kami berkenalan dengan Mathkelas dan beberapa kaedahnya. Sekarang kita akan melihat kelas ini dengan lebih terperinci.

Seperti namanya, Mathkelas mengandungi kaedah untuk operasi matematik yang paling kerap digunakan oleh pengaturcara. Berikut adalah yang paling menarik:

Kaedah Penerangan
double sin(double d)
Mengembalikan sinus sudut d, dalam radian
double cos(double d)
Mengembalikan kosinus sudut d, dalam radian
double tan(double d)
Mengembalikan tangen sudut d, dalam radian
double asin(double d)
Mengembalikan arcsine
double acos(double d)
Mengembalikan arccosine
double atan(double d)
Mengembalikan arctangent
double sinh(double d)
Mengembalikan sinus hiperbolik
double cosh(double d)
Mengembalikan kosinus hiperbolik
double tanh(double d)
Mengembalikan tangen hiperbolik

Kaedah , dan mengambil sudut yang dinyatakan dalam radian. Untuk menukar sudut daripada darjah kepada radian dan sebaliknya, kelas menawarkan dua kaedah khas:Math.sin()Math.cos()Math.tan()Math

Kaedah Penerangan
double toRadians(double angdeg)
Menukar sudut daripada darjah kepada radian
double toDegrees(double angrad)
Menukar sudut daripada radian kepada darjah

Dengan cara ini, sebagai tambahan kepada kaedah, Mathkelas juga mempunyai dua pembolehubah malar (medan statik kelas):

berterusan Penerangan
double Math.PI
Pemalar "Pi" adalah sama dengan3.141592653589793
double Math.E
Pemalar "E" adalah sama dengan2.718281828459045

Semua fungsi ini boleh menjadi sangat berguna kepada anda jika anda memutuskan untuk menulis permainan anda sendiri, bekerja dengan grafik, atau hanya mengira panjang laluan pada peta.

Contohnya, jika anda ingin mengira sin(45°), berikut ialah cara anda melakukannya:

Math.sin( Math.toRadians(45) )

Berikut ialah contoh:

public class Main
{
   public static int N = 10;

   public static void drawValue(double y)
   {
     int value = (int) (y * N) + N;
     for (int i = 0; i < 2 * N; i++)
     {
       char c = i == N ? '|': '.';
       if (i == value)
         c = '*';
       System.out.print(c);
     }
     System.out.println();
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 10 * N; i++)
     {
       double x = i * 1.0 / N;
       double y = Math.sin(x);
       drawValue(y);
     }
   }
}


2. Fungsi algebra dalam Java

Dalam kebanyakan kes, matematik sekolah menengah sudah mencukupi untuk pengaturcara: walaupun sinus dan kosinus sangat jarang ditemui dalam kod. Selalunya mereka diperlukan apabila bekerja dengan permainan, peta atau enjin permainan. 90% pengaturcara tidak pernah menghadapi ini.

Tetapi selain geometri, pengaturcara kadangkala perlu menggunakan fungsi algebra. Dan, sudah tentu, Mathkelas mengandungi yang paling biasa:

Kaedah Penerangan
double sqrt(double a)
punca kuasa dua daripadaa
double cbrt(double a)
punca padu daripadaa
double pow(double a, double b)
eksponen:ab
double exp(double a)
eksponen (nombor Euler dinaikkan kepada kuasa):ea
double log(double a)
logaritma semula jadi bagi a:ln(a)
double log10(double a)
asas-10 logaritma bagi a:log10(a)
double log1p(double x)
logaritma semula jadi bagi x + 1:ln(x + 1)
double expm1(double x)
ex-1

Jika anda mahu kuasa dua atau punca kubus nombor, kaedah sqrt(a)dan cbrt(a)disediakan untuk anda.

Punca kuasa dua boleh dikira seperti berikut:

Math.sqrt(2)

Jika anda ingin mendapatkan punca kuasa yang lebih tinggi, kemudian gunakan kaedah eksponen: akepada kuasa ¼ialah punca keempat, dsb.

Math.pow(2, 0.25)

Untuk logaritma dan eksponen, terdapat kaedah log(a)(logaritma asli) dan exp(x)(eksponen). Untuk mengira logaritma asas-10, kita ada log10(a).

Jika anda mahu logaritma nombor bmenjadi asas a, gunakan formula mudah ini:loga(b) = ln(b) / ln(a)

Kaedah yang berguna

Jika anda melakukan pengiraan yang melibatkan nilai yang sangat kecil x, maka dua fungsi terakhir — log1p()dan expm1()— mungkin berguna kepada anda.

Apabila menambah doublepembolehubah yang sangat kecil dan sangat besar, anda akan sering mendapati bahawa nilai yang sangat kecil diabaikan (dibuang) sebagai tidak penting. Malah, ini akan berlaku jika anda menggunakan kaedah log()dan exp(). Untuk menyelesaikannya, pengaturcara menghasilkan fungsi yang hanya mengembalikan "bahagian penting kecil"

Contoh:

Katakan anda ingin mengira logaritma asli bagi 1 + x, di mana xialah . Anda tidak boleh hanya menghantar nombor ini kepada kaedah, kerana jika anda menambah dan , anda mendapat . adalah nombor yang sangat kecil sehingga ia akan dibuang sepenuhnya apabila nombor itu ditambah.10-20log()110-20110-20

Oleh kerana matematik selalunya melibatkan pengiraan log()nombor yang hampir dengan 1, pengaturcara menghasilkan cara untuk mengatasi masalah ini: daripada menghantar nombor itu sendiri kepada kaedah, hanya luluskan perbezaannya daripada 1.



3. Minimum dan maksimum

Dua lagi fungsi berguna ialah min(a, b)dan max(a, b). Seperti yang anda mungkin sudah meneka, yang pertama mengembalikan minimum dua nombor:

Math.min(a, b)

Dan yang kedua mengembalikan maksimum dua nombor:

Math.max(a, b)

Mengapa kita memerlukan fungsi ini apabila anda sentiasa boleh menulis ifatau menggunakan operator ternary (a < b ? a: b)?

Ini semua tentang kebolehbacaan kod. Kadangkala kod anda terlalu sarat dengan ifpenyata dan anda mahu menggunakan tatatanda yang lebih padat. Mari bandingkan:

Kod Penerangan
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Menggunakan if-elsepernyataan (cara terpanjang untuk menulisnya)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Menggunakan operator ternary Keburukan:
- kod besar
- pengiraan dilakukan dua kali
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Ini adalah cara yang bagus untuk menulisnya, tetapi ia agak berlebihan
int x = Math.min(x-5+y*20, x*x+y*y);
Betul 🙂

4. Minimum dan maksimum beberapa nombor

Terdapat satu lagi cara yang bagus untuk menggunakan kaedah min()dan max().

Untuk mengira minimum (atau maksimum) beberapa nombor atau pembolehubah. Sangat mudah untuk membuat panggilan bersarang ke kaedah ini.

Begini cara untuk mencari minimum 3 nombor:

Math.min(a, Math.min(b, c))

Jadi apa? Ia sangat mudah: hitung minimum dua nombor, dan kemudian kembalikan minimum nombor ini dan nombor ketiga.

Minimum empat nombor diperoleh dengan cara yang sama:

Math.min(a, Math.min(b, Math.min(с, d)))

Walaupun begitu, kita boleh menulis formula ini dengan lebih jelas:

Math.min(Math.min(a, b), Math.min(c, d))

Semuanya berfungsi sama untuk max()kaedah.

Menggunakan if-elseoperator atau operator ternary akan menjadikan coretan kod ini sedikit lebih rumit. Tetapi menggunakan kaedah min()dan max()adalah sempurna.