1. Fungsi trigonometri dalam Java
Apabila kami mempelajari pembundaran nombor tadi, kami berkenalan dengan Math
kelas dan beberapa kaedahnya. Sekarang kita akan melihat kelas ini dengan lebih terperinci.
Seperti namanya, Math
kelas mengandungi kaedah untuk operasi matematik yang paling kerap digunakan oleh pengaturcara. Berikut adalah yang paling menarik:
Kaedah | Penerangan | |
---|---|---|
|
Mengembalikan sinus sudut d , dalam radian |
|
|
Mengembalikan kosinus sudut d , dalam radian |
|
|
Mengembalikan tangen sudut d , dalam radian |
|
|
Mengembalikan arcsine | |
|
Mengembalikan arccosine | |
|
Mengembalikan arctangent | |
|
Mengembalikan sinus hiperbolik | |
|
Mengembalikan kosinus hiperbolik | |
|
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 |
---|---|
|
Menukar sudut daripada darjah kepada radian |
|
Menukar sudut daripada radian kepada darjah |
Dengan cara ini, sebagai tambahan kepada kaedah, Math
kelas juga mempunyai dua pembolehubah malar (medan statik kelas):
berterusan | Penerangan |
---|---|
|
Pemalar "Pi" adalah sama dengan3.141592653589793 |
|
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, Math
kelas mengandungi yang paling biasa:
Kaedah | Penerangan |
---|---|
|
punca kuasa dua daripadaa |
|
punca padu daripadaa |
|
eksponen:ab |
|
eksponen (nombor Euler dinaikkan kepada kuasa):ea |
|
logaritma semula jadi bagi a :ln(a) |
|
asas-10 logaritma bagi a :log10(a) |
|
logaritma semula jadi bagi x + 1 :ln(x + 1) |
|
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: a
kepada 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 b
menjadi 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 double
pembolehubah 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 x
ialah . 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-20
log()
1
10-20
1
10-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 if
atau menggunakan operator ternary (a < b ? a: b)
?
Ini semua tentang kebolehbacaan kod. Kadangkala kod anda terlalu sarat dengan if
penyata dan anda mahu menggunakan tatatanda yang lebih padat. Mari bandingkan:
Kod | Penerangan |
---|---|
|
Menggunakan if-else pernyataan (cara terpanjang untuk menulisnya) |
|
Menggunakan operator ternary Keburukan: - kod besar - pengiraan dilakukan dua kali |
|
Ini adalah cara yang bagus untuk menulisnya, tetapi ia agak berlebihan |
|
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-else
operator atau operator ternary akan menjadikan coretan kod ini sedikit lebih rumit. Tetapi menggunakan kaedah min()
dan max()
adalah sempurna.