Rilis terbaru: 1.0.0-beta
Pustaka PHP 5.3+ untuk operasi aritmatika pada bilangan bulat yang membungkus saat meluap.
Perhatian
Pustaka ini tidak dimaksudkan untuk digunakan sebagai cara untuk melakukan operasi aritmatika dengan benar pada bilangan bulat dan tidak boleh digunakan sebagai pengganti operator aritmatika asli atau pustaka lain yang dirancang untuk tujuan tersebut.
Tidak seperti bahasa lain yang melimpahkan bilangan bulat positif besar ke bilangan bulat negatif besar, PHP sebenarnya melimpahkan bilangan bulat ke angka floating-point. Dalam kebanyakan kasus, luapan aritmatika harus diperlakukan sebagai keadaan tidak biasa yang memerlukan penanganan khusus. Namun, ada beberapa kasus di mana perilaku membungkus seperti itu sebenarnya berguna - misalnya dengan nomor urut TCP atau algoritma tertentu, seperti perhitungan hash. Kelas utilitas ini menyediakan fungsi aritmatika dasar yang beroperasi sesuai dengan perilaku tersebut.
Sebagai ilustrasi, perhatikan contoh berikut:
// Output on 64-bit system: float(9.2233720368548E+18)
var_dump ( PHP_MAX_INT + 1 );
// Output on 64-bit system: int(-9223372036854775808)
var_dump (IntMath:: add ( PHP_MAX_INT , 1 ));
Seperti yang ditunjukkan sebelumnya, menambahkan satu ke bilangan bulat terbesar yang didukung menggunakan operator aritmatika asli akan menghasilkan bilangan floating-point. Sebaliknya, penggunaan IntMath::add() akan menyebabkan overflow, menghasilkan bilangan bulat terkecil yang didukung dalam build PHP ini.
API didokumentasikan secara luas dalam kode sumber. Selain itu, versi HTML juga tersedia agar lebih nyaman dilihat di browser.
Gunakan Komposer untuk menginstal paket:
$ composer require phpcommon/intmath
Saat ini, hanya empat operasi aritmatika dasar (penjumlahan, pengurangan, perkalian dan pembagian) dan negasi yang didukung.
Untuk nilai bilangan bulat, negasi sama dengan pengurangan dari nol. Karena PHP menggunakan representasi komplemen dua untuk bilangan bulat dan kisaran nilai komplemen dua tidak simetris, negasi dari bilangan bulat negatif maksimum menghasilkan bilangan negatif maksimum yang sama. Terlepas dari kenyataan bahwa luapan telah terjadi, tidak ada pengecualian yang terjadi.
Untuk semua nilai integer $a
, -$a
sama dengan (~$a) + 1
.
Contoh penggunaan API:
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
Hasil penjumlahan dua bilangan bulat adalah bit orde rendah dari hasil matematika sebenarnya yang direpresentasikan dalam format komplemen dua yang cukup lebar. Jika terjadi overflow, maka tanda hasilnya mungkin tidak sama dengan tanda penjumlahan matematis kedua nilai tersebut. Meski meluap, tidak ada pengecualian yang dilemparkan dalam kasus ini.
Contoh penggunaan API:
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
Pengurangan bilangan positif menghasilkan hasil yang sama dengan penjumlahan bilangan negatif yang besarnya sama. Selain itu, pengurangan dari nol sama dengan negasi. Hasilnya adalah bit tingkat rendah dari hasil matematis sebenarnya yang direpresentasikan dalam format komplemen dua yang cukup lebar. Jika terjadi overflow, maka tanda hasilnya mungkin tidak sama dengan tanda selisih matematis kedua nilai tersebut. Meski meluap, tidak ada pengecualian yang dilemparkan dalam kasus ini.
Contoh penggunaan API:
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
Hasil perkalian dua bilangan bulat adalah bit orde rendah dari hasil matematika sebenarnya yang direpresentasikan dalam format komplemen dua yang cukup lebar. Jika terjadi luapan, maka tanda hasilnya mungkin tidak sama dengan tanda hasil kali matematika kedua nilai tersebut. Meski meluap, tidak ada pengecualian yang dilemparkan dalam kasus ini.
Contoh penggunaan API:
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
Pembagian tersebut membulatkan hasilnya menuju nol. Dengan demikian nilai absolut dari hasil adalah bilangan bulat terbesar yang mungkin kurang dari atau sama dengan nilai absolut hasil bagi kedua operan. Hasilnya nol atau positif bila kedua operan bertanda sama dan nol atau negatif bila kedua operan bertanda berlawanan.
Ada satu kasus khusus yang tidak memenuhi aturan ini: jika dividen adalah bilangan bulat negatif dengan besaran terbesar yang mungkin untuk jenisnya, dan pembaginya adalah -1
, maka terjadi luapan bilangan bulat dan hasilnya sama dengan dividen. Meski meluap, tidak ada pengecualian yang dilemparkan dalam kasus ini. Sebaliknya jika nilai pembagi dalam pembagian bilangan bulat adalah 0
, maka DivisionByZeroException
akan dilempar.
Contoh penggunaan API:
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
$ composer test
Lihat Dokumentasi Tes untuk lebih jelasnya.
Kontribusi pada paket ini selalu diterima!
Silakan lihat KONTRIBUSI dan PERILAKU untuk rinciannya.
Jika Anda menemukan masalah apa pun terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Semua konten paket ini dilisensikan di bawah lisensi MIT.