- 添加 Decimal 类型的 ceil、floor、round、sqrt、toFloat 方法测试 - 添加 BigInt 类型的 divmod、gcd、powmod、sqrt 方法测试 - 添加 Decimal 和 BigInt 的 pow 和 divmod 运算测试 - 添加 BigInt 的 toInt 和 toFloat 类型转换测试 - 验证各种数学运算的边界情况和负数处理 - 确保所有测试用例都通过严格类型声明验证pull/1/head
parent
706f4cc9ab
commit
a4d5d86905
13 changed files with 342 additions and 0 deletions
@ -0,0 +1,35 @@ |
||||
--TEST-- |
||||
BigInt: divmod |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::bigInt(10); |
||||
$b = std::bigInt(3); |
||||
$r = $a->divmod($b); |
||||
var_dump(std::bigInt($r[0])->toString()); |
||||
var_dump(std::bigInt($r[1])->toString()); |
||||
|
||||
$c = std::bigInt(100); |
||||
$d = std::bigInt(7); |
||||
$r2 = $c->divmod($d); |
||||
var_dump(std::bigInt($r2[0])->toString()); |
||||
var_dump(std::bigInt($r2[1])->toString()); |
||||
|
||||
// negative dividend |
||||
$e = std::bigInt(-10); |
||||
$f = std::bigInt(3); |
||||
$r3 = $e->divmod($f); |
||||
var_dump(std::bigInt($r3[0])->toString()); |
||||
var_dump(std::bigInt($r3[1])->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "3" |
||||
string(1) "1" |
||||
string(2) "14" |
||||
string(1) "2" |
||||
string(2) "-3" |
||||
string(2) "-1" |
||||
@ -0,0 +1,29 @@ |
||||
--TEST-- |
||||
BigInt: gcd |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::bigInt(12); |
||||
$b = std::bigInt(8); |
||||
echo $a->gcd($b)->toString(); echo "\n"; |
||||
|
||||
$c = std::bigInt(100); |
||||
$d = std::bigInt(25); |
||||
echo $c->gcd($d)->toString(); echo "\n"; |
||||
|
||||
$e = std::bigInt(17); |
||||
$f = std::bigInt(13); |
||||
echo $e->gcd($f)->toString(); echo "\n"; |
||||
|
||||
// gcd with Int argument |
||||
echo $a->gcd(4)->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
4 |
||||
25 |
||||
1 |
||||
4 |
||||
@ -0,0 +1,28 @@ |
||||
--TEST-- |
||||
BigInt: powmod |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// 2^10 mod 1000 = 1024 mod 1000 = 24 |
||||
$a = std::bigInt(2); |
||||
$r = $a->powmod(std::bigInt(10), std::bigInt(1000)); |
||||
echo $r->toString(); echo "\n"; |
||||
|
||||
// 3^20 mod 100 = 3486784401 mod 100 = 1 |
||||
$b = std::bigInt(3); |
||||
$r2 = $b->powmod(std::bigInt(20), std::bigInt(100)); |
||||
echo $r2->toString(); echo "\n"; |
||||
|
||||
// 5^3 mod 13 = 125 mod 13 = 8 |
||||
$c = std::bigInt(5); |
||||
$r3 = $c->powmod(std::bigInt(3), std::bigInt(13)); |
||||
echo $r3->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
24 |
||||
1 |
||||
8 |
||||
@ -0,0 +1,32 @@ |
||||
--TEST-- |
||||
BigInt: sqrt |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::bigInt(0); |
||||
echo $a->sqrt()->toString(); echo "\n"; |
||||
|
||||
$b = std::bigInt(1); |
||||
echo $b->sqrt()->toString(); echo "\n"; |
||||
|
||||
$c = std::bigInt(100); |
||||
echo $c->sqrt()->toString(); echo "\n"; |
||||
|
||||
// Integer sqrt: sqrt(2) = 1 |
||||
$d = std::bigInt(2); |
||||
echo $d->sqrt()->toString(); echo "\n"; |
||||
|
||||
// Large perfect square: 10^20, sqrt = 10^10 |
||||
$e = std::bigInt("100000000000000000000"); |
||||
echo $e->sqrt()->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
0 |
||||
1 |
||||
10 |
||||
1 |
||||
10000000000 |
||||
@ -0,0 +1,20 @@ |
||||
--TEST-- |
||||
BigInt: toInt / toFloat |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::bigInt(42); |
||||
var_dump($a->toInt()); |
||||
var_dump($a->toFloat()); |
||||
|
||||
$b = std::bigInt(-100); |
||||
var_dump($b->toInt()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
int(42) |
||||
float(42) |
||||
int(-100) |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Decimal: ceil |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("3.2"); |
||||
var_dump($a->ceil()->toString()); |
||||
|
||||
$b = std::decimal("-3.2"); |
||||
var_dump($b->ceil()->toString()); |
||||
|
||||
$c = std::decimal("5.0"); |
||||
var_dump($c->ceil()->toString()); |
||||
|
||||
$d = std::decimal("0.1"); |
||||
var_dump($d->ceil()->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "4" |
||||
string(2) "-3" |
||||
string(1) "5" |
||||
string(1) "1" |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Decimal: divmod |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("10"); |
||||
$b = std::decimal("3"); |
||||
$r = $a->divmod($b); |
||||
var_dump(std::decimal($r[0])->toString()); |
||||
var_dump(std::decimal($r[1])->toString()); |
||||
|
||||
$c = std::decimal("17.5"); |
||||
$d = std::decimal("5.0"); |
||||
$r2 = $c->divmod($d); |
||||
var_dump(std::decimal($r2[0])->toString()); |
||||
var_dump(std::decimal($r2[1])->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "3" |
||||
string(1) "1" |
||||
string(1) "3" |
||||
string(3) "2.5" |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Decimal: floor |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("3.7"); |
||||
var_dump($a->floor()->toString()); |
||||
|
||||
$b = std::decimal("-3.7"); |
||||
var_dump($b->floor()->toString()); |
||||
|
||||
$c = std::decimal("5.0"); |
||||
var_dump($c->floor()->toString()); |
||||
|
||||
$d = std::decimal("0.1"); |
||||
var_dump($d->floor()->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "3" |
||||
string(2) "-4" |
||||
string(1) "5" |
||||
string(1) "0" |
||||
@ -0,0 +1,22 @@ |
||||
--TEST-- |
||||
Decimal: pow |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("2"); |
||||
var_dump($a->pow(std::decimal("3"))->toString()); |
||||
|
||||
$b = std::decimal("10"); |
||||
var_dump($b->pow(std::decimal("2"))->toString()); |
||||
|
||||
$c = std::decimal("3"); |
||||
var_dump($c->pow(std::decimal("3"))->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "8" |
||||
string(3) "100" |
||||
string(2) "27" |
||||
@ -0,0 +1,22 @@ |
||||
--TEST-- |
||||
Decimal: powmod |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// 2^10 mod 1000 = 24 |
||||
$a = std::decimal("2"); |
||||
$r = $a->powmod(std::decimal("10"), std::decimal("1000")); |
||||
var_dump($r->toString()); |
||||
|
||||
// 3^4 mod 5 = 81 mod 5 = 1 |
||||
$b = std::decimal("3"); |
||||
$r2 = $b->powmod(std::decimal("4"), std::decimal("5")); |
||||
var_dump($r2->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(2) "24" |
||||
string(1) "1" |
||||
@ -0,0 +1,32 @@ |
||||
--TEST-- |
||||
Decimal: round |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// round without precision (default 0, round to integer) |
||||
$a = std::decimal("3.4"); |
||||
var_dump($a->round()->toString()); |
||||
|
||||
$b = std::decimal("3.5"); |
||||
var_dump($b->round()->toString()); |
||||
|
||||
$c = std::decimal("-3.5"); |
||||
var_dump($c->round()->toString()); |
||||
|
||||
// round with precision |
||||
$d = std::decimal("3.14159"); |
||||
var_dump($d->round(2)->toString()); |
||||
|
||||
$e = std::decimal("2.71828"); |
||||
var_dump($e->round(3)->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "3" |
||||
string(1) "4" |
||||
string(2) "-4" |
||||
string(4) "3.14" |
||||
string(5) "2.718" |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Decimal: sqrt |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("0"); |
||||
var_dump($a->sqrt()->toString()); |
||||
|
||||
$b = std::decimal("1"); |
||||
var_dump($b->sqrt()->toString()); |
||||
|
||||
$c = std::decimal("100"); |
||||
var_dump($c->sqrt()->toString()); |
||||
|
||||
$d = std::decimal("4"); |
||||
var_dump($d->sqrt()->toString()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "0" |
||||
string(1) "1" |
||||
string(2) "10" |
||||
string(1) "2" |
||||
@ -0,0 +1,18 @@ |
||||
--TEST-- |
||||
Decimal: toFloat |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("3.14"); |
||||
var_dump($a->toFloat()); |
||||
|
||||
$b = std::decimal("100.5"); |
||||
var_dump($b->toFloat()); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
float(3.14) |
||||
float(100.5) |
||||
Loading…
Reference in new issue