problem about bit asset amount

Started by alt, March 05, 2014, 01:50:16 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

alt


>>> 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+=

alt

Quote from: toast on March 05, 2014, 02:16:40 PM
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.

alt

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

toast

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
Do not use this post as information for making any important decisions. The only agreements I ever make are informal and non-binding. Take the same precautions as when dealing with a compromised account, scammer, sockpuppet, etc.

alt

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.