1. Các hàm lượng giác trong Java

Khi học cách làm tròn số trước đó, chúng ta đã làm quen với Mathlớp và một số phương pháp của nó. Bây giờ chúng ta sẽ xem xét lớp này chi tiết hơn.

Như tên ngụ ý, Mathlớp này chứa các phương thức cho các phép toán được các lập trình viên sử dụng thường xuyên nhất. Dưới đây là những điều thú vị nhất:

Phương pháp Sự miêu tả
double sin(double d)
Trả về sin của góc d, tính bằng radian
double cos(double d)
Trả về cosin của góc d, tính bằng radian
double tan(double d)
Trả về tang của góc d, tính bằng radian
double asin(double d)
Trả về arcsine
double acos(double d)
Trả về arccosine
double atan(double d)
Trả về arctang
double sinh(double d)
Trả về sin hyperbol
double cosh(double d)
Trả về cosin hyperbol
double tanh(double d)
Trả về tiếp tuyến hyperbol

Các phương thức , và lấy một góc được biểu thị bằng radian. Để chuyển đổi một góc từ độ sang radian và ngược lại, lớp cung cấp hai phương thức đặc biệt:Math.sin()Math.cos()Math.tan()Math

Phương pháp Sự miêu tả
double toRadians(double angdeg)
Chuyển đổi một góc từ độ sang radian
double toDegrees(double angrad)
Chuyển đổi một góc từ radian sang độ

Nhân tiện, ngoài các phương thức, Mathlớp còn có hai biến hằng (trường tĩnh của lớp):

Không thay đổi Sự miêu tả
double Math.PI
Hằng số "Pi" bằng3.141592653589793
double Math.E
Hằng số "E" bằng2.718281828459045

Tất cả các chức năng này có thể rất hữu ích nếu bạn quyết định viết trò chơi của riêng mình, làm việc với đồ họa hoặc đơn giản là tính toán độ dài của một con đường trên bản đồ.

Ví dụ: nếu bạn muốn tính sin(45°), đây là cách bạn thực hiện:

Math.sin( Math.toRadians(45) )

Đây là một ví dụ:

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. Các hàm đại số trong Java

Trong hầu hết các trường hợp, toán học phổ thông là đủ đối với một lập trình viên: ngay cả sin và cosin cũng rất hiếm khi được tìm thấy trong mã. Thông thường, chúng cần thiết khi làm việc với trò chơi, bản đồ hoặc công cụ trò chơi. 90% lập trình viên không bao giờ gặp phải điều này.

Nhưng bên cạnh hình học, đôi khi lập trình viên phải sử dụng các hàm đại số. Và, tất nhiên, Mathlớp chứa những cái phổ biến nhất:

Phương pháp Sự miêu tả
double sqrt(double a)
căn bậc hai củaa
double cbrt(double a)
căn bậc ba củaa
double pow(double a, double b)
lũy thừa:ab
double exp(double a)
hàm mũ (số Euler được nâng lên lũy thừa):ea
double log(double a)
logarit tự nhiên của a:ln(a)
double log10(double a)
logarit cơ số 10 của a:log10(a)
double log1p(double x)
logarit tự nhiên của x + 1:ln(x + 1)
double expm1(double x)
ex-1

Nếu bạn muốn căn bậc hai hoặc căn bậc ba của một số, phương thức sqrt(a)cbrt(a)luôn sẵn sàng phục vụ bạn.

Căn bậc hai có thể được tính như sau:

Math.sqrt(2)

Nếu bạn muốn lấy căn của một lũy thừa cao hơn, thì hãy sử dụng phương pháp lũy thừa: alũy thừa của ¼là căn bậc bốn, v.v.

Math.pow(2, 0.25)

Đối với logarit và số mũ, có các phương pháp log(a)(logarit tự nhiên) và exp(x)(số mũ). Để tính logarit cơ số 10, chúng ta có log10(a).

Nếu bạn muốn logarit của một số bcó cơ số a, hãy sử dụng công thức đơn giản sau:loga(b) = ln(b) / ln(a)

phương pháp hữu ích

Nếu bạn đang thực hiện các phép tính liên quan đến các giá trị rất nhỏ của x, thì hai hàm cuối — log1p()expm1()— có thể hữu ích cho bạn.

Khi thêm các biến rất nhỏ và rất lớn double, bạn sẽ thường thấy rằng các giá trị rất nhỏ đơn giản bị bỏ qua (loại bỏ) vì không đáng kể. Trên thực tế, điều này sẽ xảy ra nếu bạn sử dụng các phương thức log()exp(). Để giải quyết vấn đề này, các lập trình viên đã nghĩ ra các hàm chỉ trả về "phần quan trọng nhỏ"

Ví dụ:

Giả sử bạn muốn tính logarit tự nhiên của 1 + x, ở xđâu . Bạn không thể đơn giản chuyển số này cho phương thức, vì nếu bạn thêm và , bạn sẽ nhận được . là một số nhỏ đến mức nó sẽ bị loại bỏ hoàn toàn khi các số được thêm vào.10-20log()110-20110-20

Bởi vì toán học thường liên quan đến việc tính toán các log()số gần bằng 1, nên các lập trình viên đã nghĩ ra một cách để giải quyết vấn đề này: thay vì chuyển chính số đó cho phương thức, chỉ chuyển chênh lệch của nó từ 1.



3. Tối thiểu và tối đa

Hai chức năng hữu ích hơn là min(a, b)max(a, b). Như bạn có thể đã đoán, số đầu tiên trả về ít nhất hai số:

Math.min(a, b)

Và thứ hai trả về tối đa hai số:

Math.max(a, b)

Tại sao chúng ta cần những hàm này khi bạn luôn có thể viết ifhoặc thậm chí sử dụng toán tử bậc ba (a < b ? a: b)?

Đó là tất cả về khả năng đọc mã. Đôi khi mã của bạn bị quá tải với ifcác câu lệnh và bạn muốn sử dụng ký hiệu nhỏ gọn hơn. Hãy so sánh:

Mã số Sự miêu tả
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Sử dụng một if-elsetuyên bố (cách dài nhất để viết nó)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Sử dụng toán tử bậc ba Nhược điểm:
- mã cồng kềnh
- phép tính được thực hiện hai lần
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Cách viết này hay nhưng hơi thừa
int x = Math.min(x-5+y*20, x*x+y*y);
Vừa phải 🙂

4. Tối thiểu và tối đa của một số số

Có một cách tuyệt vời khác để sử dụng các phương thức min()max().

Để tính toán tối thiểu (hoặc tối đa) của một số số hoặc biến. Rất thuận tiện để thực hiện các cuộc gọi lồng nhau đến các phương thức này.

Dưới đây là cách tìm tối thiểu 3 số:

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

Vậy thì sao? Tính năng này cực kỳ tiện lợi: tính giá trị nhỏ nhất của hai số, sau đó trả về giá trị nhỏ nhất của số này và số thứ ba.

Tối thiểu bốn số được lấy theo cùng một cách:

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

Điều đó nói rằng, chúng ta có thể viết công thức này rõ ràng hơn một chút:

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

Tất cả đều hoạt động giống nhau đối với max()phương pháp.

Việc sử dụng if-elsetoán tử hoặc toán tử bậc ba sẽ làm cho các đoạn mã này trở nên rườm rà hơn một chút. Nhưng sử dụng các phương thức min()max()là hoàn hảo.