รุ่นล่าสุด: 1.0.0-เบต้า
ไลบรารี่ PHP 5.3+ สำหรับการดำเนินการทางคณิตศาสตร์กับจำนวนเต็มที่ล้อมรอบเมื่อล้น
ความสนใจ
ไลบรารีนี้ไม่ได้มีไว้สำหรับใช้เป็นวิธีดำเนินการทางคณิตศาสตร์กับจำนวนเต็มอย่างเหมาะสม และไม่ควรใช้แทนตัวดำเนินการทางคณิตศาสตร์ดั้งเดิมหรือไลบรารีอื่นใดที่ออกแบบมาเพื่อวัตถุประสงค์ดังกล่าว
ไม่เหมือนกับภาษาอื่น ๆ ที่ล้นจำนวนเต็มบวกขนาดใหญ่ไปเป็นจำนวนเต็มลบขนาดใหญ่ จริงๆ แล้ว PHP ล้นจำนวนเต็มเป็นตัวเลขทศนิยม ในกรณีส่วนใหญ่ การโอเวอร์โฟลว์ทางคณิตศาสตร์จะต้องถือเป็นสถานการณ์ที่ผิดปกติซึ่งต้องมีการจัดการเป็นพิเศษ อย่างไรก็ตาม มีบางกรณีที่ลักษณะการทำงาน แบบ Wrap-around ดังกล่าวมีประโยชน์จริงๆ เช่น กับหมายเลขลำดับ TCP หรืออัลกอริธึมบางอย่าง เช่น การคำนวณแฮช คลาสยูทิลิตี้นี้มีฟังก์ชันทางคณิตศาสตร์พื้นฐานที่ทำงานตามพฤติกรรมนั้น
เพื่อให้เห็นภาพ ให้พิจารณาตัวอย่างต่อไปนี้:
// 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 ));
ดังที่แสดงไว้ก่อนหน้านี้ การบวกหนึ่งเข้ากับจำนวนเต็มที่ใหญ่ที่สุดที่รองรับโดยใช้ตัวดำเนินการทางคณิตศาสตร์ดั้งเดิมจะส่งผลให้ได้ตัวเลขจุดลอยตัว ในทางตรงกันข้าม การใช้ IntMath::add() จะทำให้เกิดการโอเวอร์โฟลว์ ส่งผลให้มีจำนวนเต็มที่น้อยที่สุดที่รองรับใน PHP รุ่นนี้
API ได้รับการบันทึกไว้อย่างกว้างขวางในซอร์สโค้ด นอกจากนี้ ยังมีเวอร์ชัน HTML เพื่อการดูที่สะดวกยิ่งขึ้นในเบราว์เซอร์อีกด้วย
ใช้ Composer เพื่อติดตั้งแพ็คเกจ:
$ composer require phpcommon/intmath
ปัจจุบันรองรับเฉพาะการดำเนินการทางคณิตศาสตร์พื้นฐานสี่รายการเท่านั้น (การบวก การลบ การคูณ และการหาร) และการปฏิเสธ
สำหรับค่าจำนวนเต็ม การปฏิเสธจะเหมือนกับการลบออกจากศูนย์ เนื่องจาก PHP ใช้การแสดงส่วนเสริมสองสำหรับจำนวนเต็ม และช่วงของค่าเสริมสองส่วนนั้นไม่สมมาตร การปฏิเสธของจำนวนเต็มลบสูงสุดจะส่งผลให้เกิดจำนวนลบสูงสุดที่เท่ากัน แม้ว่าจะมีการโอเวอร์โฟลว์เกิดขึ้น แต่ก็ไม่มีข้อยกเว้นเกิดขึ้น
สำหรับค่าจำนวนเต็มทั้งหมด $a
, -$a
เท่ากับ (~$a) + 1
ตัวอย่างการใช้งาน API:
// Outputs int(-100)
var_dump (IntMath:: negate ( 100 ));
ผลลัพธ์ของการบวกจำนวนเต็มสองตัวคือบิตลำดับต่ำของผลลัพธ์ทางคณิตศาสตร์ที่แท้จริงซึ่งแสดงในรูปแบบส่วนเติมเต็มสองที่มีความกว้างเพียงพอ หากเกิดการโอเวอร์โฟลว์ เครื่องหมายของผลลัพธ์อาจไม่เหมือนกับเครื่องหมายของผลรวมทางคณิตศาสตร์ของทั้งสองค่า แม้จะมีการโอเวอร์โฟลว์ แต่ก็ไม่มีข้อยกเว้นในกรณีนี้
ตัวอย่างการใช้งาน API:
// Outputs int(300)
var_dump (IntMath:: add ( 100 , 200 ));
การลบจำนวนบวกจะให้ผลลัพธ์เหมือนกับการบวกจำนวนลบที่มีขนาดเท่ากัน นอกจากนี้ การลบออกจากศูนย์จะเหมือนกับการปฏิเสธ ผลลัพธ์ที่ได้คือบิตลำดับต่ำของผลลัพธ์ทางคณิตศาสตร์ที่แท้จริงซึ่งแสดงในรูปแบบส่วนเสริมสองที่มีความกว้างเพียงพอ หากเกิดการโอเวอร์โฟลว์ เครื่องหมายของผลลัพธ์อาจไม่เหมือนกับเครื่องหมายของความแตกต่างทางคณิตศาสตร์ของทั้งสองค่า แม้จะมีการโอเวอร์โฟลว์ แต่ก็ไม่มีข้อยกเว้นเกิดขึ้นในกรณีนี้
ตัวอย่างการใช้งาน API:
// Outputs int(90)
IntMath:: subtract ( 100 , 10 );
ผลลัพธ์ของการคูณจำนวนเต็มสองตัวคือบิตที่มีลำดับต่ำของผลลัพธ์ทางคณิตศาสตร์ที่แท้จริงซึ่งแสดงในรูปแบบส่วนเติมเต็มสองที่มีความกว้างเพียงพอ หากเกิดการโอเวอร์โฟลว์ เครื่องหมายของผลลัพธ์อาจไม่เหมือนกับเครื่องหมายของผลิตภัณฑ์ทางคณิตศาสตร์ของทั้งสองค่า แม้จะมีการโอเวอร์โฟลว์ แต่ก็ไม่มีข้อยกเว้นเกิดขึ้นในกรณีนี้
ตัวอย่างการใช้งาน API:
// Outputs int(200)
IntMath:: multiply ( 100 , 2 );
การหารจะปัดเศษผลลัพธ์ให้เป็นศูนย์ ดังนั้นค่าสัมบูรณ์ของผลลัพธ์จึงเป็นจำนวนเต็มที่ใหญ่ที่สุดที่เป็นไปได้ ซึ่งน้อยกว่าหรือเท่ากับค่าสัมบูรณ์ของผลหารของตัวถูกดำเนินการทั้งสองตัว ผลลัพธ์จะเป็นศูนย์หรือบวกเมื่อทั้งสองตัวถูกดำเนินการมีเครื่องหมายเหมือนกัน และเป็นศูนย์หรือลบเมื่อทั้งสองตัวถูกดำเนินการมีเครื่องหมายตรงกันข้าม
มีกรณีพิเศษกรณีหนึ่งที่ไม่เป็นไปตามกฎนี้: หากเงินปันผลเป็นจำนวนเต็มลบที่มีขนาดมากที่สุดที่เป็นไปได้สำหรับประเภทของมัน และตัวหารคือ -1
จำนวนเต็มล้นจะเกิดขึ้น และผลลัพธ์จะเท่ากับเงินปันผล แม้จะมีการโอเวอร์โฟลว์ แต่ก็ไม่มีข้อยกเว้นเกิดขึ้นในกรณีนี้ ในทางกลับกัน หากค่าของตัวหารในการหารจำนวนเต็มเป็น 0
ดังนั้น DivisionByZeroException
จะถูกส่งออกไป
ตัวอย่างการใช้งาน API:
// Outputs int(50)
IntMath:: divide ( 100 , 2 );
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมว่ามีอะไรเปลี่ยนแปลงเมื่อเร็วๆ นี้
$ composer test
ตรวจสอบเอกสารการทดสอบสำหรับรายละเอียดเพิ่มเติม
ยินดีต้อนรับการมีส่วนร่วมในแพ็คเกจเสมอ!
โปรดดูรายละเอียดที่การมีส่วนร่วมและการปฏิบัติ
หากคุณพบปัญหาที่เกี่ยวข้องกับความปลอดภัย โปรดส่งอีเมลมาที่ [email protected] แทนการใช้ตัวติดตามปัญหา
เนื้อหาทั้งหมดของแพ็คเกจนี้ได้รับอนุญาตภายใต้ใบอนุญาต MIT