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 Math
lớ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ụ ý, Math
lớ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ả | |
---|---|---|
|
Trả về sin của góc d , tính bằng radian |
|
|
Trả về cosin của góc d , tính bằng radian |
|
|
Trả về tang của góc d , tính bằng radian |
|
|
Trả về arcsine | |
|
Trả về arccosine | |
|
Trả về arctang | |
|
Trả về sin hyperbol | |
|
Trả về cosin hyperbol | |
|
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ả |
---|---|
|
Chuyển đổi một góc từ độ sang radian |
|
Chuyển đổi một góc từ radian sang độ |
Nhân tiện, ngoài các phương thức, Math
lớ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ả |
---|---|
|
Hằng số "Pi" bằng3.141592653589793 |
|
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, Math
lớp chứa những cái phổ biến nhất:
Phương pháp | Sự miêu tả |
---|---|
|
căn bậc hai củaa |
|
căn bậc ba củaa |
|
lũy thừa:ab |
|
hàm mũ (số Euler được nâng lên lũy thừa):ea |
|
logarit tự nhiên của a :ln(a) |
|
logarit cơ số 10 của a :log10(a) |
|
logarit tự nhiên của x + 1 :ln(x + 1) |
|
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)
và 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: a
lũ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ố b
có 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()
và 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()
và 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-20
log()
1
10-20
1
10-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)
và 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 if
hoặ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 if
cá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ả |
---|---|
|
Sử dụng một if-else tuyên bố (cách dài nhất để viết nó) |
|
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 |
|
Cách viết này hay nhưng hơi thừa |
|
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()
và 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-else
toá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()
và max()
là hoàn hảo.
GO TO FULL VERSION