From: fsb4000 Date: Tue, 18 Nov 2014 14:12:26 +0000 (+0600) Subject: точность вычислений X-Git-Tag: nvc-v0.5.0~35^2 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=f9667dcb3358df975ed3c6d2e2ff717ae4c44eb8 точность вычислений Кажется нашёл, почему могут быть расхождения. Потому что при вычислении int dayWeight отбрасывается дробная часть при делении. Изменил так, чтобы деление проходило в coinAge. Так же сократил умножение на 2^224 и деление на 2^256 до деления на 2^32 Все оригинальные вычисления не удалил, а оставил в коментариях. --- diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj index 7780327..cd66c30 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj @@ -1,4 +1,4 @@ - + @@ -286,6 +286,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ + diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters index e5b1238..04a11fd 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters @@ -195,6 +195,9 @@ Generated Files + + Source Files + diff --git a/src/kernelrecord.cpp b/src/kernelrecord.cpp index eb68dd4..8c1d778 100644 --- a/src/kernelrecord.cpp +++ b/src/kernelrecord.cpp @@ -77,11 +77,14 @@ int64 KernelRecord::getAge() const double KernelRecord::getProbToMintStake(double difficulty, int timeOffset) const { - double maxTarget = pow(static_cast(2), 224); - double target = maxTarget / difficulty; - int dayWeight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge) / 86400; - uint64 coinAge = max(nValue * dayWeight / COIN, (int64)0); - return target * coinAge / pow(static_cast(2), 256); + //double maxTarget = pow(static_cast(2), 224); + //double target = maxTarget / difficulty; + //int dayWeight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge) / 86400; + //uint64 coinAge = max(nValue * dayWeight / COIN, (int64)0); + //return target * coinAge / pow(static_cast(2), 256); + int Weight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge); + uint64 coinAge = max(nValue * Weight / (COIN * 86400), (int64)0); + return coinAge / (pow(static_cast(2),32) * difficulty); } double KernelRecord::getProbToMintWithinNMinutes(double difficulty, int minutes)