1. Java'da trigonometrik fonksiyonlar

Daha önce yuvarlama sayılarını incelediğimizde, Mathsınıf ve bazı yöntemleri hakkında bilgi sahibi olduk. Şimdi bu sınıfa daha detaylı bakacağız.

Adından da anlaşılacağı gibi, Mathsınıf, programcılar tarafından en sık kullanılan matematiksel işlemler için yöntemler içerir. İşte en ilginç olanlar:

Yöntem Tanım
double sin(double d)
Açının sinüsünü dradyan cinsinden verir
double cos(double d)
Açının kosinüsünü dradyan cinsinden verir
double tan(double d)
Açının tanjantını dradyan cinsinden verir
double asin(double d)
Arksinüsü döndürür
double acos(double d)
Arccosine döndürür
double atan(double d)
arktanjantı döndürür
double sinh(double d)
Hiperbolik sinüsü döndürür
double cosh(double d)
Hiperbolik kosinüsü döndürür
double tanh(double d)
Hiperbolik teğeti döndürür

, ve yöntemleri radyan cinsinden ifade edilen bir açı alır. Bir açıyı dereceden radyana veya tam tersine dönüştürmek için sınıf iki özel yöntem sunar:Math.sin()Math.cos()Math.tan()Math

Yöntem Tanım
double toRadians(double angdeg)
Bir açıyı dereceden radyana dönüştürür
double toDegrees(double angrad)
Bir açıyı radyandan dereceye dönüştürür

Bu arada, metotlara ek olarak, sınıfın ayrıca iki sabit değişkeniMath vardır (sınıfın statik alanları):

Devamlı Tanım
double Math.PI
"Pi" sabiti eşittir3.141592653589793
double Math.E
"E" sabiti şuna eşittir:2.718281828459045

Kendi oyunlarınızı yazmaya, grafiklerle çalışmaya veya sadece bir haritadaki bir yolun uzunluğunu hesaplamaya karar verirseniz, tüm bu işlevler sizin için çok yararlı olabilir.

Örneğin, hesaplamak istiyorsanız sin(45°), bunu şu şekilde yapabilirsiniz:

Math.sin( Math.toRadians(45) )

İşte bir örnek:

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'da cebirsel işlevler

Çoğu durumda, bir programcı için lise matematiği yeterlidir: kodda sinüsler ve kosinüsler bile çok nadiren bulunur. Çoğu zaman oyunlar, haritalar veya oyun motorları ile çalışırken ihtiyaç duyulur. Programcıların %90'ı bununla hiç karşılaşmaz.

Ancak geometrinin yanı sıra, programcılar bazen cebirsel işlevleri kullanmak zorunda kalırlar. Ve elbette, Mathsınıf en yaygın olanları içerir:

Yöntem Tanım
double sqrt(double a)
kareköküa
double cbrt(double a)
kübik köküa
double pow(double a, double b)
üs alma:ab
double exp(double a)
üstel (Euler'in sayısı bir güce yükseltildi):ea
double log(double a)
doğal logaritması a:ln(a)
double log10(double a)
10 tabanlı logaritması a:log10(a)
double log1p(double x)
doğal logaritması x + 1:ln(x + 1)
double expm1(double x)
ex-1

Bir sayının karesini veya küp kökünü istiyorsanız, sqrt(a)ve cbrt(a)yöntemleri hizmetinizdedir.

Karekök şu şekilde hesaplanabilir:

Math.sqrt(2)

Daha yüksek bir kuvvete sahip bir kök elde etmek istiyorsanız, üs alma yöntemini kullanın: ato ¼4. köktür, vb.

Math.pow(2, 0.25)

log(a)Logaritmalar ve üsler için (doğal logaritma) ve exp(x)(üstel) yöntemler vardır . 10 tabanlı logaritmayı hesaplamak için elimizde log10(a).

bBir sayının logaritmasının taban olmasını istiyorsanız a, şu basit formülü kullanın:loga(b) = ln(b) / ln(a)

Yararlı yöntemler

Çok küçük değerler içeren hesaplamalar yapıyorsanız x, son iki işlev - log1p()ve expm1()- sizin için yararlı olabilir.

Çok küçük ve çok büyük değişkenler eklerken double, genellikle çok küçük değerlerin önemsiz olarak görmezden gelindiğini (atıldığını) görürsünüz. log()Aslında, and yöntemlerini kullanırsanız bu gerçekleşir exp(). Bunu çözmek için, programcılar yalnızca "küçük önemli parçayı" döndüren işlevler buldular.

Örnek:

1 + xDiyelim ki , nerede x' nin doğal logaritmasını hesaplamak istiyorsunuz ? Bu sayıyı yönteme kolayca iletemezsiniz , çünkü ve eklerseniz elde edersiniz . o kadar küçük bir sayı ki, sayılar eklendiğinde tamamen atılacak.10-20log()110-20110-20

Matematik genellikle ' log()ye yakın sayıların hesaplanmasını içerdiğinden 1, programcılar bu sorunu aşmanın bir yolunu buldular: yönteme sayının kendisini iletmek yerine, yalnızca 'den olan farkını iletin 1.



3. Minimum ve maksimum

İki kullanışlı işlev daha vardır min(a, b)ve max(a, b). Muhtemelen zaten tahmin ettiğiniz gibi, ilki en az iki sayıyı döndürür:

Math.min(a, b)

İkincisi, maksimum iki sayıyı döndürür:

Math.max(a, b)

ifHer zaman üçlü işleç yazabileceğiniz ve hatta kullanabileceğiniz halde neden bu işlevlere ihtiyacımız var (a < b ? a: b)?

Her şey kodun okunabilirliği ile ilgili. Bazen kodunuz ififadelerle aşırı yüklenir ve daha kompakt notasyon kullanmak istersiniz. Hadi karşılaştıralım:

kod Tanım
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Bir ifade kullanma if-else(onu yazmanın en uzun yolu)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Üçlü operatörü kullanma Eksileri:
- hacimli kod
- hesaplamalar iki kez yapılır
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Bu, onu yazmanın harika bir yolu, ama biraz gereksiz
int x = Math.min(x-5+y*20, x*x+y*y);
Aynen öyle 🙂

4. Birkaç sayının minimum ve maksimum değeri

min()and yöntemlerini kullanmanın başka bir harika yolu daha var max().

Birkaç sayı veya değişkenin minimumunu (veya maksimumunu) hesaplamak için. Bu yöntemlere iç içe çağrılar yapmak çok uygundur.

En az 3 sayının nasıl bulunacağı aşağıda açıklanmıştır:

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

Ne olmuş? Çok kullanışlı: iki sayının minimumunu hesaplayın ve ardından bu sayının minimumunu ve üçüncü sayıyı döndürün.

En az dört sayı aynı şekilde elde edilir:

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

Bununla birlikte, bu formülü biraz daha net yazabiliriz:

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

Her şey yöntem için aynı şekilde çalışır max().

if-elseOperatörü veya üçlü operatörü kullanmak, bu kod parçacıklarını biraz daha hantal hale getirir. Ancak min()ve max()yöntemlerini kullanmak tek kelimeyle mükemmel.