Bagikan melalui


Operator Aritmatika

Topik ini menjelaskan operator aritmatika yang tersedia di F#.

Ringkasan Operator Aritmatika Biner

Operasi aritmatika di F# dapat dilakukan dalam dua mode: Tidak Terkendali dan Terkendali. Secara default, operasi aritmatika menggunakan perilaku tanpa pengecekan, yang memprioritaskan kinerja tetapi memungkinkan terjadinya overflow/underflow. Operator yang diperiksa memprioritaskan keselamatan dengan melemparkan pengecualian dalam kasus seperti itu.

Operator Aritmatika Tanpa Pemeriksaan

Tabel berikut ini meringkas operator aritmetika biner yang tersedia untuk Aritmatika Tidak Dicentang dengan jenis integral dan titik mengambang yang tidak dikotak.

Operator biner Catatan
+ (tambahan, plus) Tidak dicentang. Kemungkinan kondisi luapan ketika angka ditambahkan bersama-sama dan jumlah melebihi nilai absolut maksimum yang didukung oleh jenis .
- (pengurangan, minus) Tidak dicentang. Kemungkinan kondisi underflow terjadi ketika tipe tanpa tanda dikurangi, atau ketika nilai titik mengambang terlalu kecil untuk dapat diwakili oleh tipe tersebut.
* (perkalian, waktu) Tidak dicentang. Kemungkinan kondisi luapan ketika angka dikalikan sehingga hasil kali melebihi nilai absolut maksimum yang didukung oleh tipe data.
/ (pembagian, dibagi dengan) Pembagian dengan nol menyebabkan DivideByZeroException untuk jenis integral. Untuk jenis floating-point, pembagian dengan nol menghasilkan nilai floating-point khusus infinity atau -infinity. Ada juga kemungkinan kondisi underflow ketika angka floating-point terlalu kecil untuk diwakili oleh tipe.
% (sisa) Mengembalikan sisa operasi pembagian. Tanda hasilnya sama dengan tanda operand pertama.
** (eksponensiasi, ke kekuatan) Kemungkinan kondisi overflow ketika hasil melebihi nilai absolut maksimum untuk tipe tersebut.

Operator eksponensiasi hanya berfungsi dengan jenis floating-point.

Perilaku yang tidak diawasi tidak melemparkan pengecualian ketika terjadi luapan atau pengurangan yang terlalu kecil, membuatnya kurang aman untuk aritmatika pada nilai besar atau kasus batas.

Operator Aritmatika Diperiksa

Tabel berikut ini meringkas operator aritmetika biner yang tersedia untuk Aritmatika Diperiksa dengan jenis integral yang tidak dikotak. Operator yang diperiksa memastikan bahwa perhitungan diverifikasi untuk luapan atau aliran bawah, menyediakan aritmatika yang lebih aman untuk aplikasi penting.

Operator Biner Catatan
+ (tambahan, plus) Melemparkan OverflowException jika hasilnya melebihi nilai maksimum atau berada di bawah nilai minimum yang didukung oleh jenis . Baik Luapan dan Pengurangan dimungkinkan.
- (pengurangan, minus) Melemparkan OverflowException jika hasilnya melebihi nilai maksimum atau berada di bawah nilai minimum yang didukung oleh jenis . Baik Luapan dan Pengurangan dimungkinkan.
* (perkalian, waktu) Mengeluarkan OverflowException jika produk melebihi nilai maksimum atau kurang dari nilai minimum yang didukung oleh tipe data. Baik Luapan dan Pengurangan dimungkinkan.

Operator yang diawasi berguna untuk memastikan bahwa luapan aritmatika ditangkap dan ditangani secara eksplisit.

Berikut adalah contohnya:

open Microsoft.FSharp.Core.Operators.Checked

let safeAddition () =
    try
        let result = 2147483647 + 1 // Attempt to add integers at their maximum boundary
        printfn "Result: %d" result
    with
    | :? System.OverflowException as ex ->
        printfn "Overflow occurred: %s" ex.Message

safeAddition()

// Output:
// Overflow occurred: Arithmetic operation resulted in an overflow.

Memilih Antara Operator yang Diperiksa dan Tidak Dicentang

Operator yang Diperiksa: Ideal untuk skenario di mana kesalahan luapan harus dideteksi dan ditangani secara eksplisit.

Operator Tidak Dicentang: Secara default, F# menggunakan aritmatika yang tidak dicentang karena alasan performa. Operasi ini dapat secara diam-diam menghasilkan hasil yang salah ketika luapan atau aliran bawah terjadi. Gunakan dengan hati-hati.

Ringkasan Operator Aritmatika Unari

Tabel berikut ini meringkas operator aritmetika unary yang tersedia untuk jenis integral dan floating-point.

Operator Unaer Catatan
+ (positif) Dapat diterapkan ke ekspresi aritmatika apa pun. Tidak mengubah tanda nilai.
- (negasi, negatif) Dapat diterapkan ke ekspresi aritmatika apa pun. Mengubah tanda nilai.

Perilaku pada luapan atau aliran bawah untuk jenis integral adalah membungkus. Ini menyebabkan hasil yang salah. Luapan bilangan bulat adalah masalah yang berpotensi serius yang dapat berkontribusi pada masalah keamanan ketika perangkat lunak tidak ditulis untuk memperhitungkannya. Jika ini menjadi perhatian aplikasi Anda, pertimbangkan untuk menggunakan operator yang diperiksa di Microsoft.FSharp.Core.Operators.Checked.

Ringkasan Operator Perbandingan Biner

Tabel berikut ini memperlihatkan operator perbandingan biner yang tersedia untuk jenis integral dan floating-point. Operator ini mengembalikan nilai jenis bool.

Angka floating-point tidak boleh dibandingkan secara langsung untuk kesetaraan, karena representasi floating-point IEEE tidak mendukung operasi kesetaraan yang tepat. Dua angka yang dapat Anda verifikasi dengan mudah agar sama dengan memeriksa kode mungkin benar-benar memiliki representasi bit yang berbeda.

Operator Catatan
= (kesetaraan, sama dengan) Ini bukan operator penugasan. Ini hanya digunakan untuk perbandingan. Ini adalah operator generik.
> (lebih besar dari) Ini adalah operator generik.
< (kurang dari) Ini adalah operator generik.
>= (lebih besar dari atau sama dengan) Ini adalah operator generik.
<= (kurang dari atau sama dengan) Ini adalah operator generik.
<> (tidak sama) Ini adalah operator generik.

Operator Yang Kelebihan Beban dan Generik

Semua operator yang dibahas dalam topik ini didefinisikan dalam Microsoft.FSharp.Core.Operators namespace. Beberapa operator didefinisikan dengan menggunakan parameter jenis yang diselesaikan secara statis. Ini berarti bahwa ada definisi individual untuk setiap jenis tertentu yang berfungsi dengan operator tersebut. Semua operator aritmatika dan bitwise, baik yang unary maupun biner, berada dalam kategori ini. Operator perbandingan bersifat umum dan oleh karena itu bekerja dengan jenis apa pun, bukan hanya jenis aritmatika primitif. Penyatuan dan jenis rekaman yang diskriminasi memiliki implementasi kustom mereka sendiri yang dihasilkan oleh pengkompilasi F#. Jenis kelas menggunakan metode Equals.

Operator generik dapat disesuaikan. Untuk menyesuaikan fungsi perbandingan, gantikan Equals untuk menyediakan perbandingan kesetaraan kustom Anda sendiri, lalu terapkan IComparable. Antarmuka System.IComparable memiliki satu metode, metode CompareTo.

Operator dan Inferensi Tipe

Penggunaan operator dalam ekspresi membatasi inferensi jenis pada operator tersebut. Selain itu, penggunaan operator mencegah generalisasi otomatis, karena penggunaan operator menyiratkan jenis aritmatika. Dengan tidak adanya informasi lain, pengkompilasi F# menyimpulkan int sebagai jenis ekspresi aritmatika. Anda dapat mengambil alih perilaku ini dengan menentukan jenis lain. Dengan demikian jenis argumen dan jenis pengembalian function1 dalam kode berikut disimpulkan int, tetapi jenis untuk function2 disimpulkan float.

// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y

// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y

Lihat juga