BitShares Forum
Main => General Discussion => Topic started by: alt on March 05, 2014, 01:50:16 pm
-
the data struct for amount of xts/bitasset is unit128
struct unit123{
private:
uint64_t hi;
uint64_t lo;
};
hi/lo has a limit with 2^64=18446744073709551616
here is the asset class
asset::asset( float d, asset::type t )
:unit(t)
{
amount = fc::uint128(double(d) * COIN,0);
}
#define COIN (100000000ll)
so the amount has a limit about 2^64/COIN=184467440737
No problem to use this for amount of xfs, but It can't work with bitasset like bitusd.
-
COIN should be per-asset, we don't need 8 digits of precision after the decimal point for BitUSD. If you think of it like shares 128 bits should always be high enough resolution... some assets will just have a larger smallest divisible unit
-
some bugs are caused by this.
>>> short 184467440737usd
price (usd/bts): 184467440737
current balance: 33134.12286383 bts
required collateral: 10.00000000 bts
submit order? (y|n): y
>>> buy 184467440737usd
price per usd (ie: 1 usd): 0.00000001bts
current balance: 33134.12286383 bts
total price: 1844.67440736 bts
submit order? (y|n): y
>>> mine
>>> market bts usd
unspecified
overflow 10.00000000 bts * 184467440736.9999974400000 usd/bts
{"a":"10.00000000 bts","p":"184467440736.9999974400000 usd/bts"}
th_a asset.cpp:269 operator*
type mismatch multiplying asset 10.00000000 bts by price 184467440736.9999974400000 usd/bts
{"a":"10.00000000 bts","p":"184467440736.9999974400000 usd/bts"}
th_a asset.cpp:307 operator*
>>> buy 100usd
price per usd (ie: 1 usd): 0.01bts
current balance: 35634.12286383 bts
total price: 1.00000000 bts
submit order? (y|n): y
order submitted
>>> mine
unspecified
overflow 1.00000000 bts * 184467440736.9999974400000 usd/bts
{"a":"1.00000000 bts","p":"184467440736.9999974400000 usd/bts"}
th_a asset.cpp:269 operator*
type mismatch multiplying asset 1.00000000 bts by price 184467440736.9999974400000 usd/bts
{"a":"1.00000000 bts","p":"184467440736.9999974400000 usd/bts"}
th_a asset.cpp:307 operator*
{"quote":"usd","base":"bts"}
th_a blockchain_db.cpp:756 match_orders
{}
th_a blockchain_db.cpp:1149 match_orders
error generating new block
{}
th_a blockchain_db.cpp:1319 generate_next_block
-
COIN should be per-asset, we don't need 8 digits of precision after the decimal point for BitUSD. If you think of it like shares 128 bits should always be high enough resolution... some assets will just have a larger smallest divisible unit
I suggest just 2 digits after the decimal point for bitasset. so the limmit for bitusd can up to 184467440737095516.
-
>>> balance
36938.51500400 bts
184467440730.00000000 usd
0.00000000 btc
0.00000000 gld
....
>>> buy 18446744073usd
price per usd (ie: 1 usd): 0.00000001bts
current balance: 36938.51500400 bts
total price: 184.46744073 bts
submit order? (y|n): y
order submitted
>>> mine
>>> balance
36754.04741711 bts
unspecified
asset addition overflowed 184467440730.00000000 usd + 18446744073.00000000 usd = 18446744065.90448384 usd
{"a":"184467440730.00000000 usd","b":"18446744073.00000000 usd","c":"18446744065.90448384 usd"}
th_a asset.cpp:124 operator+=