cc: make additional cities scale on 2^n, not 10^n

This commit is contained in:
Crypto City 2020-02-20 15:29:14 +00:00
parent 912906634f
commit 6d4f2a20bc
3 changed files with 20 additions and 23 deletions

View File

@ -1211,8 +1211,8 @@ uint64_t get_shares_needed_for_cities(size_t num_cities)
// fixed point - shifted by 32 bits
static uint256_t get_ideal_cities_32_256(uint64_t total_shares)
{
static const int256_t base = log10fix32(IDEAL_CITIES_SHARE_SCALE);
int256_t x = 0x100000000 + log10fix32(total_shares) - base;
static const int256_t base = log2fix32(IDEAL_CITIES_SHARE_SCALE);
int256_t x = 0x100000000 + log2fix32(total_shares) - base;
if (x < 1)
x = 1;
return x.convert_to<uint256_t>();

View File

@ -36,7 +36,7 @@ typedef boost::multiprecision::uint256_t uint256_t;
#define INV_LOG2_E_Q1DOT31 UINT64_C(0x58b90bfc) // Inverse log base 2 of e
#define INV_LOG2_10_Q1DOT31 UINT64_C(0x268826a1) // Inverse log base 2 of 10
int256_t log10fix32 (uint256_t x)
int256_t log2fix32 (uint256_t x)
{
// This implementation is based on Clay. S. Turner's fast binary logarithm
// algorithm[1].
@ -70,8 +70,5 @@ int256_t log10fix32 (uint256_t x)
b >>= 1;
}
y *= INV_LOG2_10_Q1DOT31;
y >>= 31;
return y;
}

View File

@ -2624,25 +2624,25 @@ static bool about_equal(uint64_t x, uint64_t y)
TEST(cc, cities)
{
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 1) >> 32, 1);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 11) >> 32, 2);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 90) >> 32, 2);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 101) >> 32, 3);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 990) >> 32, 3);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 1010) >> 32, 4);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 9900) >> 32, 4);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 10100) >> 32, 5);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 99000) >> 32, 5);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 101000) >> 32, 6);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 990000) >> 32, 6);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 1010000) >> 32, 7);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 9900000) >> 32, 7);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 10100000) >> 32, 8);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 2) >> 32, 2);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 3) >> 32, 2);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 4) >> 32, 3);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 7) >> 32, 3);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 8) >> 32, 4);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 15) >> 32, 4);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 16) >> 32, 5);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 31) >> 32, 5);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 32) >> 32, 6);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 63) >> 32, 6);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 64) >> 32, 7);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 127) >> 32, 7);
EXPECT_EQ(cc::get_ideal_cities_32(IDEAL_CITIES_SHARE_SCALE * 128) >> 32, 8);
EXPECT_TRUE(about_equal(cc::get_new_city_cost(0, IDEAL_CITIES_SHARE_SCALE), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(1, IDEAL_CITIES_SHARE_SCALE * 10), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(2, IDEAL_CITIES_SHARE_SCALE * 100), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(3, IDEAL_CITIES_SHARE_SCALE * 1000), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(4, IDEAL_CITIES_SHARE_SCALE * 10000), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(1, IDEAL_CITIES_SHARE_SCALE * 2), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(2, IDEAL_CITIES_SHARE_SCALE * 4), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(3, IDEAL_CITIES_SHARE_SCALE * 8), BASE_CITY_COST));
EXPECT_TRUE(about_equal(cc::get_new_city_cost(4, IDEAL_CITIES_SHARE_SCALE * 16), BASE_CITY_COST));
}
TEST(cc, accrual_steps)