1. Trigonometric function sa Java

Noong nag-aral kami ng rounding numbers kanina, nakilala namin ang Mathklase at ang ilan sa mga pamamaraan nito. Titingnan natin ngayon ang klase na ito nang mas detalyado.

Tulad ng ipinahihiwatig ng pangalan, ang Mathklase ay naglalaman ng mga pamamaraan para sa mga operasyong matematikal na pinakamadalas na ginagamit ng mga programmer. Narito ang mga pinaka-kawili-wili:

Pamamaraan Paglalarawan
double sin(double d)
Ibinabalik ang sine ng anggulo d, sa radians
double cos(double d)
Ibinabalik ang cosine ng anggulo d, sa radians
double tan(double d)
Ibinabalik ang tangent ng anggulo d, sa radians
double asin(double d)
Ibinabalik ang arcsine
double acos(double d)
Ibinabalik ang arccosine
double atan(double d)
Ibinabalik ang arctangent
double sinh(double d)
Ibinabalik ang hyperbolic sine
double cosh(double d)
Ibinabalik ang hyperbolic cosine
double tanh(double d)
Ibinabalik ang hyperbolic tangent

Ang , at mga pamamaraan ay tumatagal ng isang anggulo na ipinahayag sa radians. Upang i-convert ang isang anggulo mula sa mga degree patungo sa mga radian at vice versa, ang klase ay nag-aalok ng dalawang espesyal na pamamaraan:Math.sin()Math.cos()Math.tan()Math

Pamamaraan Paglalarawan
double toRadians(double angdeg)
Kino-convert ang isang anggulo mula sa mga degree sa radians
double toDegrees(double angrad)
Kino-convert ang isang anggulo mula sa radians sa degrees

Sa pamamagitan ng paraan, bilang karagdagan sa mga pamamaraan, ang Mathklase ay mayroon ding dalawang pare-parehong mga variable (static na mga patlang ng klase):

pare-pareho Paglalarawan
double Math.PI
Ang pare-parehong "Pi" ay katumbas ng3.141592653589793
double Math.E
Ang pare-parehong "E" ay katumbas ng2.718281828459045

Ang lahat ng mga function na ito ay maaaring maging lubhang kapaki-pakinabang sa iyo kung magpasya kang magsulat ng iyong sariling mga laro, magtrabaho kasama ang mga graphics, o simpleng kalkulahin ang haba ng isang landas sa isang mapa.

Halimbawa, kung gusto mong kalkulahin sin(45°), narito kung paano mo ito gagawin:

Math.sin( Math.toRadians(45) )

Narito ang isang halimbawa:

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. Algebraic function sa Java

Sa karamihan ng mga kaso, sapat na ang matematika sa high school para sa isang programmer: kahit na ang mga sine at cosine ay napakabihirang makita sa code. Kadalasan ay kinakailangan ang mga ito kapag nagtatrabaho sa mga laro, mapa o mga makina ng laro. 90% ng mga programmer ay hindi kailanman nakatagpo nito.

Ngunit bukod sa geometry, ang mga programmer kung minsan ay kailangang gumamit ng mga algebraic function. At, siyempre, Mathnaglalaman ang klase ng mga pinakakaraniwan:

Pamamaraan Paglalarawan
double sqrt(double a)
square root nga
double cbrt(double a)
cubic root nga
double pow(double a, double b)
exponentiation:ab
double exp(double a)
exponential (napataas ang numero ni Euler sa isang kapangyarihan):ea
double log(double a)
natural logarithm ng a:ln(a)
double log10(double a)
base-10 logarithm ng a:log10(a)
double log1p(double x)
natural logarithm ng x + 1:ln(x + 1)
double expm1(double x)
ex-1

Kung gusto mo ang square o cube root ng isang numero, ang sqrt(a)at cbrt(a)mga pamamaraan ay nasa iyong serbisyo.

Ang square root ay maaaring kalkulahin tulad ng sumusunod:

Math.sqrt(2)

Kung nais mong makakuha ng ugat ng isang mas mataas na kapangyarihan, pagkatapos ay gamitin ang paraan ng exponentiation: asa kapangyarihan ng ¼ay ang pang-apat na ugat, atbp.

Math.pow(2, 0.25)

Para sa mga logarithm at exponent, mayroong mga log(a)(natural na logarithm) at exp(x)(exponential) na mga pamamaraan. Upang kalkulahin ang base-10 logarithm, mayroon kaming log10(a).

Kung gusto mong bibase ang logarithm ng isang numero a, gamitin ang simpleng formula na ito:loga(b) = ln(b) / ln(a)

Mga kapaki-pakinabang na pamamaraan

Kung nagsasagawa ka ng mga kalkulasyon na kinasasangkutan ng napakaliit na halaga ng x, kung gayon ang huling dalawang function — log1p()at expm1()— ay maaaring maging kapaki-pakinabang sa iyo.

Kapag nagdaragdag ng napakaliit at napakalaking doublevariable, madalas mong makikita na ang napakaliit na halaga ay binabalewala lang (itinatapon) bilang hindi gaanong mahalaga. Sa katunayan, ito ay mangyayari kung gagamitin mo ang log()at exp()mga pamamaraan. Upang malutas ito, ang mga programmer ay gumawa ng mga function na nagbabalik lamang ng "maliit na makabuluhang bahagi"

Halimbawa:

Ipagpalagay na gusto mong kalkulahin ang natural na logarithm ng 1 + x, where xis . Hindi mo basta-basta maipapasa ang numerong ito sa pamamaraan, dahil kung idaragdag mo at , makakakuha ka ng . ay napakaliit na numero na ito ay ganap na itatapon kapag ang mga numero ay idinagdag.10-20log()110-20110-20

Dahil ang matematika ay kadalasang nagsasangkot ng pagkalkula ng log()mga numerong malapit sa 1, ang mga programmer ay nakaisip ng isang paraan upang malutas ang problemang ito: sa halip na ipasa ang numero mismo sa pamamaraan, ipasa lamang ang pagkakaiba nito mula sa 1.



3. Minimum at maximum

Dalawang mas kapaki-pakinabang na function ay min(a, b)at max(a, b). Tulad ng malamang na nahulaan mo na, ibinabalik ng una ang minimum na dalawang numero:

Math.min(a, b)

At ibinabalik ng pangalawa ang maximum na dalawang numero:

Math.max(a, b)

Bakit natin kailangan ang mga function na ito kapag maaari mong palaging magsulat ifo kahit na gamitin ang ternary operator (a < b ? a: b)?

Ang lahat ay tungkol sa pagiging madaling mabasa ng code. Minsan ang iyong code ay na-overload ng ifmga pahayag at gusto mong gumamit ng mas compact na notation. Ihambing natin:

Code Paglalarawan
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Paggamit ng if-elsepahayag (ang pinakamahabang paraan ng pagsulat nito)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Gamit ang ternary operator Cons:
- napakalaking code
- Ang mga kalkulasyon ay isinasagawa nang dalawang beses
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Ito ay isang mahusay na paraan upang isulat ito, ngunit ito ay medyo kalabisan
int x = Math.min(x-5+y*20, x*x+y*y);
Tama lang 🙂

4. Minimum at maximum ng ilang numero

May isa pang mahusay na paraan upang gamitin ang min()at max()mga pamamaraan.

Upang kalkulahin ang minimum (o maximum) ng ilang mga numero o variable. Napakaginhawang gumawa ng mga nested na tawag sa mga paraang ito.

Narito kung paano hanapin ang minimum na 3 numero:

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

E ano ngayon? Ito ay sobrang maginhawa: kalkulahin ang minimum na dalawang numero, at pagkatapos ay ibalik ang minimum ng numerong ito at ang ikatlong numero.

Ang minimum na apat na numero ay nakuha sa parehong paraan:

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

Iyon ay sinabi, maaari naming isulat ang formula na ito nang mas malinaw:

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

Ang lahat ay gumagana nang pareho para sa max()pamamaraan.

Ang paggamit ng if-elseoperator o ternary operator ay gagawing mas mahirap ang mga snippet ng code na ito. Ngunit ang paggamit ng min()at max()mga pamamaraan ay perpekto lamang.