1. 자바 삼각함수

Math이전에 반올림 숫자를 공부했을 때 클래스와 그 방법 중 일부에 대해 알게 되었습니다 . 이제 이 클래스에 대해 자세히 살펴보겠습니다.

이름에서 알 수 있듯이 이 Math클래스에는 프로그래머가 가장 자주 사용하는 수학 연산에 대한 메서드가 포함되어 있습니다. 다음은 가장 흥미로운 것입니다.

방법 설명
double sin(double d)
각도의 사인을 d라디안으로 반환합니다.
double cos(double d)
각도의 코사인 값을 d라디안으로 반환합니다.
double tan(double d)
각도의 탄젠트를 d라디안으로 반환합니다.
double asin(double d)
아크사인을 반환합니다.
double acos(double d)
아크코사인을 반환합니다.
double atan(double d)
아크탄젠트를 반환합니다.
double sinh(double d)
하이퍼볼릭 사인을 반환합니다.
double cosh(double d)
하이퍼볼릭 코사인을 반환합니다.
double tanh(double d)
하이퍼볼릭 탄젠트를 반환합니다.

, 및 메서드는 라디안 으로 표시되는 각도를 취합니다. 각도를 도에서 라디안으로 또는 그 반대로 변환하기 위해 이 클래스는 두 가지 특수 메서드를 제공합니다.Math.sin()Math.cos()Math.tan()Math

방법 설명
double toRadians(double angdeg)
각도를 도에서 라디안으로 변환
double toDegrees(double angrad)
각도를 라디안에서 도로 변환합니다.

그런데 클래스에는 메서드 외에도 두 개의 상수 변수 (클래스의 정적 필드) Math가 있습니다 .

끊임없는 설명
double Math.PI
"Pi" 상수는 다음과 같습니다.3.141592653589793
double Math.E
"E" 상수는 다음과 같습니다.2.718281828459045

이 모든 기능은 자신만의 게임을 작성하거나, 그래픽 작업을 하거나, 단순히 지도에서 경로의 길이를 계산하기로 결정한 경우 매우 유용할 수 있습니다.

예를 들어 를 계산하려면 sin(45°)다음과 같이 하십시오.

Math.sin( Math.toRadians(45) )

예를 들면 다음과 같습니다.

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. Java의 대수 함수

대부분의 경우 고등학교 수학은 프로그래머에게 충분합니다. 사인과 코사인조차도 코드에서 거의 발견되지 않습니다. 대부분 게임, 지도 또는 게임 엔진으로 작업할 때 필요합니다. 프로그래머의 90%는 이런 일을 겪지 않습니다.

그러나 기하학 외에도 프로그래머는 때때로 대수 함수를 사용해야 합니다. 물론 Math클래스에는 가장 일반적인 클래스가 포함되어 있습니다.

방법 설명
double sqrt(double a)
의 제곱근a
double cbrt(double a)
의 세제곱근a
double pow(double a, double b)
지수:ab
double exp(double a)
지수(오일러 수의 거듭제곱):ea
double log(double a)
다음의 자연 로그 a:ln(a)
double log10(double a)
밑이 10인 로그 a:log10(a)
double log1p(double x)
다음의 자연 로그 x + 1:ln(x + 1)
double expm1(double x)
ex-1

숫자의 제곱근 또는 세제곱근을 원하는 경우 sqrt(a)cbrt(a)방법을 사용할 수 있습니다.

제곱근은 다음과 같이 계산할 수 있습니다.

Math.sqrt(2)

더 높은 거듭제곱의 근을 얻으려면 거듭제곱 방법을 사용 a하십시오 ¼.

Math.pow(2, 0.25)

log(a)로그 및 지수의 경우 (자연 로그) 및 exp(x)(지수) 방법이 있습니다 . 밑이 10인 로그를 계산하려면 log10(a).

숫자의 로그를 b밑으로 하려면 a다음 간단한 공식을 사용하십시오.loga(b) = ln(b) / ln(a)

유용한 방법

의 매우 작은 값을 포함하는 계산을 수행하는 경우 x마지막 두 함수 — log1p()and expm1()—가 유용할 수 있습니다.

매우 작은 변수와 매우 큰 변수를 추가할 때 double매우 작은 값이 중요하지 않은 것으로 간주되어 무시(버려짐)되는 경우가 종종 있습니다. 사실 이것은 log()and exp()메소드를 사용하는 경우에 발생합니다. 이를 해결하기 위해 프로그래머들은 "작고 중요한 부분"만 반환하는 함수를 고안했습니다.

예:

의 자연 로그를 계산한다고 가정합니다 1 + x. 여기서 는 x입니다 . 와 를 더하면 을 얻게 되므로 단순히 이 숫자를 메서드에 전달할 수 없습니다 . 숫자가 더해지면 완전히 버려질 정도로 작은 숫자입니다.10-20log()110-20110-20

log()수학은 종종 에 가까운 숫자의 계산을 포함하기 때문에 1프로그래머는 이 문제를 해결하는 방법을 생각해 냈습니다. 숫자 자체를 메서드에 전달하는 대신 에서 차이만 전달하는 것입니다 1.



3. 최소 및 최대

두 가지 더 유용한 기능은 min(a, b)및 입니다 max(a, b). 이미 짐작하셨겠지만 첫 번째는 두 숫자 중 최소값을 반환합니다.

Math.min(a, b)

두 번째는 최대 두 숫자를 반환합니다.

Math.max(a, b)

if항상 쓰거나 삼항 연산자를 사용할 수 있는데 왜 이러한 함수가 필요한가요 (a < b ? a: b)?

코드의 가독성에 관한 것입니다. 때로는 코드가 문으로 오버로드되어 if더 간결한 표기법을 사용하고자 할 수 있습니다. 비교해보자:

암호 설명
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
문 사용 if-else(가장 긴 작성 방법)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
삼항 연산자 사용 단점:
- 부피가 큰 코드
- 계산이 두 번 수행됨
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
이것은 쓰기 좋은 방법이지만 약간 중복됩니다.
int x = Math.min(x-5+y*20, x*x+y*y);
바로 🙂

4. 여러 숫자의 최소값과 최대값

min()and 메서드를 사용하는 또 다른 좋은 방법이 있습니다 max().

여러 숫자나 변수의 최소값(또는 최대값)을 계산합니다. 이러한 메서드를 중첩 호출하는 것이 매우 편리합니다.

최소 3개의 숫자를 찾는 방법은 다음과 같습니다.

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

그래서 뭐? 매우 편리합니다. 두 숫자의 최소값을 계산한 다음 이 숫자의 최소값과 세 번째 숫자를 반환합니다.

최소 4개의 숫자는 같은 방식으로 얻습니다.

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

즉, 이 공식을 좀 더 명확하게 작성할 수 있습니다.

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

방법 에 대해 모두 동일하게 작동합니다 max().

if-else연산자 또는 삼항 연산자를 사용하면 이러한 코드 스니펫이 조금 더 복잡해집니다. 그러나 min()max()방법을 사용하는 것은 완벽합니다.