да чёрт его знает как оно работает если честно
Аналгем за 1-й курс, метод половинного деления aka бисекция

Составляем уравнение:
(nRewardCoinYearLimit / nRewardCoinYear) ^ 3 = bnProofOfStakeLimit / bnTarget
где неизвестным является nRewardCoinYear. Затем пытаемся решить его слегка модифицированным методом бисекции. Модифицированным, потому что находит только корни на отрезке [CENT, COIN]. Если же корень за пределами отрезка, то в качестве решения просто берется крайняя точка с соответствующей стороны отрезка.
nProofReward = min(10, CoinAge / 3650 * (difficulty / 0.03125) ^ (1/3))
Ах вот о какой формуле речь.
Исправлено:
https://github.com/novacoin-project/novacoin/wiki/Proof-of-stake3) Считаем nProofReward:
8343.240769 * 0.30 * 33 / (365 * 33 + 8) = 6.852906
А в блоке видим
Reward 6.852708
Формулы годятся для оценок, но не дадут значений, совпадающих с результатами метода бисекции. Более того, на разных платформах они могут давать разные результаты... Простой пример в питоне, те же числа:
8343.240769 * ((0.03125 / 1.16394928) ** (1.0 / 3)) * 33 / (365 * 33 + 8)
И совсем другой результат: 6.840043785996486
Для полной идентичности следует использовать метод половинного деления. Тогда всегда будет выдавать совпадающие значения, где бы ни исполнялось и на чем бы ни было написано. Если же целью не является разработка альтернативного клиента или сборщика блоков, то формулы вполне применимы для оценок, о чем и сказал сегодня Пеньку.
Проблема основная в том, что для нормальной переносимости на разные платформы при вычислении награды нежелательно пользоваться чем-то помимо целочисленной арифметики. Поэтому и приходится иногда прибегать к более громоздким, но универсальным решениям.
P.S. На самом деле, если говорить совсем уж строго, то это бисекция является приближением. Но в нашем случае это не имеет значения, поскольку формулы не универсальны.