Скажи, у меня число 0.1e + 308.Как я могу взять показатель 308 (который является основанием 10) и найти правильный показатель в шестнадцатеричном (основание 16)?
Я не просто имею в виду преобразование 308 в шестнадцатеричное.- Это легко!Я хочу найти эквивалентное шестнадцатеричное число для e308.
Мне это нужно, потому что у меня есть процедура, которая добавляет правильное количество нулей к концу числа.Я использовал десятичное число (основание 10), но моя процедура занимает слишком много времени (~ 20 секунд), чтобы найти ответ.
Но если я использую шестнадцатеричное значение, я могу найти результат менее чем за секунду.Поскольку преобразование базы 16 в двоичное выполняется очень быстро.
Числа, которые я вычисляю, довольно большие, поэтому подумайте о чем-то вроде BigInteger.Но я кодирую его на C ++.
EDIT 1
Это моя процедура для преобразования десятичной строки в двоичный массив битов.
case 10:
bitsSum = bits_duplicate(bitsDst);
if (bitsSum == NULL)
goto error;
bitsTen = bits_create_value(maxBits, 10);
if (bitsTen == NULL)
goto error;
int len = str_chars_length(strDup);
char c;
for (i = 0; i < len; i++) {
c = strDup[i] - '0';
if (c == 0)
continue;
if (bits_set(bitsSum, c) == 0)
goto error;
for (k = 0; k < len - i - 1; k++) {
if (bits_multiply(bitsTen, bitsSum) == 0)
goto error;
}
if (bits_add(bitsSum, bitsDst) == 0)
goto error;
}
break;
Вы можете ясно видеть, что преобразование строкового значения в эквивалентный двоичный массив происходит медленно, поскольку требует умножения и сложения.
Но моя процедура преобразования шестнадцатеричной строки в двоичный массив битов очень быстрая:
d = ((strDup[i] >= '0' && strDup[i] <= '9') ? strDup[i] - '0' : (strDup[i] >= 'a' && strDup[i] <= 'f') ? strDup[i] - 'a' + 10 : strDup[i] - 'A' + 10);
bitsDst->bitArray[k++] = (d & 1) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 2) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 4) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 8) ? 1 : 0;