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)
exponential (เลขออยเลอร์ยกกำลัง):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()และ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))

แล้วไง สะดวกมาก: คำนวณค่าต่ำสุดของตัวเลขสองตัว จากนั้นส่งคืนค่าต่ำสุดของตัวเลขนี้และตัวเลขที่สาม

จะได้รับตัวเลขอย่างน้อยสี่ตัวด้วยวิธีเดียวกัน:

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

ที่กล่าวว่าเราสามารถเขียนสูตรนี้ให้ชัดเจนขึ้นเล็กน้อย:

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

มันใช้งานได้เหมือนกันสำหรับmax()วิธีการนี้

การใช้if-elseโอเปอเรเตอร์หรือโอเปอเรเตอร์ ternaryจะทำให้ข้อมูลโค้ดเหล่านี้ยุ่งยากขึ้นเล็กน้อย แต่การใช้ วิธี min()and max()นั้นสมบูรณ์แบบ