mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Add bigint fixes to lib7
This commit is contained in:
@@ -44,16 +44,15 @@ fn BigInt* BigInt.init(&self, int128 value)
|
||||
fn BigInt* BigInt.init_with_u128(&self, uint128 value)
|
||||
{
|
||||
self.data[..] = 0;
|
||||
int128 tmp = value;
|
||||
uint128 tmp = value;
|
||||
uint len = 0;
|
||||
while (tmp != 0 && len < MAX_LEN)
|
||||
while (tmp != 0)
|
||||
{
|
||||
self.data[len] = (uint)(tmp & 0xFFFFFFFF);
|
||||
tmp >>= 32;
|
||||
len++;
|
||||
}
|
||||
self.len = len;
|
||||
assert(value == 0 || tmp == 0 || !self.is_negative());
|
||||
assert(!self.is_negative());
|
||||
self.len = max(len, 1);
|
||||
return self;
|
||||
}
|
||||
@@ -64,11 +63,18 @@ fn BigInt* BigInt.init_with_u128(&self, uint128 value)
|
||||
fn BigInt* BigInt.init_with_array(&self, uint[] values)
|
||||
{
|
||||
self.data[..] = 0;
|
||||
|
||||
if (values.len == 0)
|
||||
{
|
||||
self.len = 1;
|
||||
return self;
|
||||
}
|
||||
|
||||
self.len = values.len;
|
||||
|
||||
foreach_r(i, val : values)
|
||||
{
|
||||
values[values.len - 1 - i] = val;
|
||||
self.data[values.len - 1 - i] = val;
|
||||
}
|
||||
while (self.len > 1 && self.data[self.len - 1] == 0)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
module std::math::bigint @test;
|
||||
|
||||
fn void test_init_with_u128()
|
||||
{
|
||||
BigInt bi @noinit;
|
||||
assert(!bi.init_with_u128(uint128.max).is_negative());
|
||||
}
|
||||
|
||||
fn void init_with_array()
|
||||
{
|
||||
BigInt bi @noinit;
|
||||
assert(bi.init_with_array({}).equals(ZERO));
|
||||
assert(bi.init_with_array({0, 0, 0, 1}).equals(bigint::from_int(1)));
|
||||
assert("100000000" == bi.init_with_array({1, 0}).to_string_with_radix(16, allocator::temp()));
|
||||
}
|
||||
|
||||
fn void test_parse16()
|
||||
{
|
||||
BigInt bi @noinit;
|
||||
|
||||
Reference in New Issue
Block a user