Как преобразовать десятичную экспоненту, например, e + 308 (в основании 10), в шестнадцатеричное число с эквивалентной величиной? - PullRequest
0 голосов
/ 23 февраля 2019

Скажи, у меня число 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;

1 Ответ

0 голосов
/ 23 февраля 2019

0,1e + 308 = 10 ^ 307

Log10 (10 ^ 307) = 307

Log16 (10 ^ 307) = Log10 (10 ^ 307) / Log10 (16) =307 / Log10 (16)

...