Здесь, S быстрый способ расчета трудности. Он использует модифицированный ряд Тэйлора для логарифмов (вы можете увидеть учебники по flipcode и википедия) и опирается на бревнах, чтобы трансформировать расчет сложности:
Код:
#включают
#включают
встроенный поплавок fast_log (поплавок Валу)
{
INT * Const exp_ptr = reinterpret_cast(&Val);
ИНТ х = * exp_ptr;
Const INT log_2 = ((х >> 23) & 255) - 128;
Икс &= ~ (255 << 23);
х + = 127 << 23;
* exp_ptr = х;
Val = ((-1.0f / 3) * Val + 2) * Val - 2.0f / 3;
Возвращение ((вал + log_2) * 0.69314718f);
}
плывут трудности (неподписанные INT бит)
{
статическая двойная max_body = fast_log (0x00ffff), scaland = fast_log (256);
вернуться ехр (max_body - fast_log (биты & 0x00FFFFFF) + scaland * (0x1D - ((биты & 0xff000000) >> 24)));
}
Int основных ()
{
станд :: соиЬ << Трудность (0x1b0404cb) << станд :: епсИ;
возвращать 0;
}
#включают
встроенный поплавок fast_log (поплавок Валу)
{
INT * Const exp_ptr = reinterpret_cast
ИНТ х = * exp_ptr;
Const INT log_2 = ((х >> 23) & 255) - 128;
Икс &= ~ (255 << 23);
х + = 127 << 23;
* exp_ptr = х;
Val = ((-1.0f / 3) * Val + 2) * Val - 2.0f / 3;
Возвращение ((вал + log_2) * 0.69314718f);
}
плывут трудности (неподписанные INT бит)
{
статическая двойная max_body = fast_log (0x00ffff), scaland = fast_log (256);
вернуться ехр (max_body - fast_log (биты & 0x00FFFFFF) + scaland * (0x1D - ((биты & 0xff000000) >> 24)));
}
Int основных ()
{
станд :: соиЬ << Трудность (0x1b0404cb) << станд :: епсИ;
возвращать 0;
}
К сожалению, у меня нет особого смысла для него в libbitcoin. Может быть, некоторые шахтер будет полезен.
Чтобы увидеть математику, чтобы перейти от обычных расчетов трудности (которые требуют больших больших Интс больше, чем пространство, в любом нормальном целом) к вышеуказанному расчету, вот некоторые питона:
Код:
импорт десятичное, математика
л = Math.log
е = Math.E
печать 0x00ffff * 2 ** (8 * (0x1D - 3)) / поплавок (0x0404cb * 2 ** (8 * (0x1b - 3)))
печать л (0x00ffff * 2 ** (8 * (0x1D - 3)) / поплавок (0x0404cb * 2 ** (8 * (0x1b - 3))))
печать л (0x00ffff * 2 ** (8 * (0x1D - 3))) - л (0x0404cb * 2 ** (8 * (0x1b - 3)))
печать л (0x00ffff) + L (2 ** (8 * (0x1D - 3))) - л (0x0404cb) - л (2 ** (8 * (0x1b - 3)))
печать л (0x00ffff) + (8 * (0x1D - 3)) * л (2) - л (0x0404cb) - (8 * (0x1b - 3)) * л (2)
печать л (0x00ffff / поплавок (0x0404cb)) + (8 * (0x1D - 3)) * л (2) - (8 * (0x1b - 3)) * л (2)
печать л (0x00ffff / поплавок (0x0404cb)) + (0x1D - 0x1b) * л (2 ** 8)
л = Math.log
е = Math.E
печать 0x00ffff * 2 ** (8 * (0x1D - 3)) / поплавок (0x0404cb * 2 ** (8 * (0x1b - 3)))
печать л (0x00ffff * 2 ** (8 * (0x1D - 3)) / поплавок (0x0404cb * 2 ** (8 * (0x1b - 3))))
печать л (0x00ffff * 2 ** (8 * (0x1D - 3))) - л (0x0404cb * 2 ** (8 * (0x1b - 3)))
печать л (0x00ffff) + L (2 ** (8 * (0x1D - 3))) - л (0x0404cb) - л (2 ** (8 * (0x1b - 3)))
печать л (0x00ffff) + (8 * (0x1D - 3)) * л (2) - л (0x0404cb) - (8 * (0x1b - 3)) * л (2)
печать л (0x00ffff / поплавок (0x0404cb)) + (8 * (0x1D - 3)) * л (2) - (8 * (0x1b - 3)) * л (2)
печать л (0x00ffff / поплавок (0x0404cb)) + (0x1D - 0x1b) * л (2 ** 8)
Cya
обновление: Ссылки добавлены Миз