точность вычислений 56/head
authorfsb4000 <fsb4000@yandex.ru>
Tue, 18 Nov 2014 14:12:26 +0000 (20:12 +0600)
committerfsb4000 <fsb4000@yandex.ru>
Tue, 18 Nov 2014 14:12:26 +0000 (20:12 +0600)
Кажется нашёл, почему могут быть расхождения.
Потому что при вычислении int dayWeight  отбрасывается дробная часть при
делении.
Изменил так, чтобы деление проходило в coinAge. Так же сократил
умножение на 2^224 и деление на 2^256 до деления на 2^32
Все оригинальные вычисления не удалил, а  оставил в коментариях.

MSVC/mynovacoinqt/mynovacoinqt.vcxproj
MSVC/mynovacoinqt/mynovacoinqt.vcxproj.filters
src/kernelrecord.cpp

index 7780327..cd66c30 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+\feff<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
@@ -286,6 +286,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\
     </PreBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\..\src\kernelrecord.cpp" />
     <ClCompile Include="..\..\src\qt\aboutdialog.cpp" />
     <ClCompile Include="..\..\src\qt\addressbookpage.cpp" />
     <ClCompile Include="..\..\src\qt\addresstablemodel.cpp" />
index e5b1238..04a11fd 100644 (file)
     <ClCompile Include="build\moc_mintingfilterproxy.cpp">
       <Filter>Generated Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\kernelrecord.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <CustomBuild Include="..\..\src\qt\aboutdialog.h">
index eb68dd4..8c1d778 100644 (file)
@@ -77,11 +77,14 @@ int64 KernelRecord::getAge() const
 
 double KernelRecord::getProbToMintStake(double difficulty, int timeOffset) const
 {
-    double maxTarget = pow(static_cast<double>(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<double>(2), 256);
+    //double maxTarget = pow(static_cast<double>(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<double>(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<double>(2),32) * difficulty);
 }
 
 double KernelRecord::getProbToMintWithinNMinutes(double difficulty, int minutes)