バグ報告:丸め処理の不具合
これを見てくれ……
0.3.1 を 2 台の別々のマシンにインストールして、1 bitpenny(0.01)を移動した:
-= 送金前 =-
[bitcoind@box1 ~]$ ~/bin/bitcoind getinfo { “balance” : 1.150000000000, “blocks” : 68717, “connections” : 6, “proxy” : "", “generate” : false, “genproclimit” : -1, “difficulty” : 181.5432893640505 }
[bitcoind@box2 ~]$ ~/bin/bitcoind getinfo { “balance” : 0.000000000000, “blocks” : 68717, “connections” : 22, “proxy” : "", “generate” : false, “genproclimit” : -1, “difficulty” : 181.5432893640505 }
-= 送金後 =-
[bitcoind@box1 ~]$ ~/bin/bitcoind getinfo { “balance” : 1.139999999999, “blocks” : 68717, “connections” : 10, “proxy” : "", “generate” : false, “genproclimit” : -1, “difficulty” : 181.5432893640505 }
[bitcoind@box2 ~]$ ~/bin/bitcoind getinfo { “balance” : 0.010000000000, “blocks” : 68717, “connections” : 20, “proxy” : "", “generate” : false, “genproclimit” : -1, “difficulty” : 181.5432893640505 }
個人的には表示の問題だと思うが、確信は持てない……変だろう?
両マシンとも FreeBSD 7.2/amd64 で動かしている。
getinfo が JSON-RPC の結果を返すために浮動小数点に変換する際の丸め誤差に違いない。金額を表すために浮動小数点を使用している唯一の場所は、JSON-RPC で値を返す時だ。
1.139999999999 は Bitcoin が内部的に表現できる精度より長い。
内部的には、以下のどちらかしかありえない:
1.13999999 または
1.14000000
1.139999999999 は 1.13999999 よりも 1.14000000 にはるかに近いため、1.14000000 に違いない。
コードはこうなっている: (double)GetBalance() / (double)COIN.
(今のところ簡単な修正方法が思いつかない)
表示のバグだと思った。bitpenny を逆方向に送り返したら、最初の箱の残高は初期状態に戻った 😛