Exemplo n.º 1
0
        public virtual double TargetToDifficulty(UInt256 target)
        {
            // implementation is equivalent of HighestTarget / target

            // perform the division
            UInt256 remainder;
            var     result = UInt256.DivRem(HighestTarget, target, out remainder);

            // count the leading zeros in the highest target, use this to determine significant digits in the division
            var insignificant = HighestTarget.ToByteArray().Reverse().TakeWhile(x => x == 0).Count();

            // take only as many significant digits as can fit into a double (8 bytes) to calculate the fractional value
            var remainderDouble = (double)(Bits.ToUInt64((remainder >> (8 * insignificant)).ToByteArray().Take(8).ToArray()));
            var divisorDouble   = (double)(Bits.ToUInt64((target >> (8 * insignificant)).ToByteArray().Take(8).ToArray()));

            // return the difficulty whole value plus the fractional value
            return((double)result + (remainderDouble / divisorDouble));
        }