Преобразование Double в значения и показатели степени - PullRequest
1 голос
/ 15 июня 2009

Например.

двойной размер = 10,35;

я должен получить

значение = 1035;

экспонента = -2;

, поэтому, когда я пересчитаю, я получу 10,35.

т. Е. 1035 * 10 ^ -2 = 10,35;

Пожалуйста, помогите мне. Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 15 июня 2009

Как правило, это невозможно, поскольку дробная часть двойного числа хранится в степенях-2 и может соответствовать или не соответствовать степеням-10.

Например: при взгляде на «полномочия-2» против «полномочия-3»: точно так же как 1/2 == 2 ^ -1 == 5 * 10 ^ -1 соответствует, 1/3 == 3 ^ -1 == ?? не совпадает.

Однако вы можете приблизить его.

Было бы ответ, если бы вы попросили полномочия 2. В этом случае вы можете просто посмотреть на двойное представление (см. IEEE-754 здесь ) и извлечь нужные биты.

0 голосов
/ 31 декабря 2012

Мне пришлось сделать что-то очень похожее. Вот решение в Python (оно не было проверено очень хорошо):

def normalize(value, fdigits=2):
    """
    Convert a string representing a numerical value to value-digit/exponent form. 
    Round the fractional portion to the given number of digits.

    value    the value (string)
    fdigits  the number of digits to which to round the fractional 
             portion
    """

    # if empty string, return error
    if not value:
        return None

    # split value by decimal
    v = value.split('.')

    # if too many decimals, return error
    if len(v) > 2:
        return None

    # add empty string for fractional portion if missing
    elif len(v) == 1:
        v.append('')

    # assign whole and fractional portions
    (w, f) = v

    # pad fractional portion up to number of significant digits if necessary
    if len(f) < fdigits:
        f += ('0' * (fdigits - len(f)))

    # if the number of digits in the fractional portion exceeds the
    # number of digits allowed by fdigits
    elif len(f) > fdigits:
        # convert both portions to integers; use '0' for whole portion if missing
        (wi, fi) = (int(w or '0'), int(f[:fdigits]))

        # round up if first insignificant digit is gteq 5
        if int(f[fdigits]) >= 5:
            fi += 1

            # roll whole value up if fractional portion rounds to a whole
            if len(str(fi)) > fdigits:
                wi += 1
                fi = 0

        # replace the whole and fractional strings
        (w, f) = (str(wi), ("%0" + str(fdigits) + "d") % fi)

    # derive value digits and exponent
    n = w.lstrip() + f

    l = len(n)
    x = -fdigits

    n = n.rstrip('0')
    x += (l - len(n))

    # return value digits and exponent
    return (int(n), x)
0 голосов
/ 15 июня 2009

Очень просто (в C #):

        double size = 10.36;
        int power = 0;
        while (size != (int)size)
        {
            size *= 10.0;
            power--;
        }
        Console.WriteLine("{0} * 10 to the {1}", size, power);

Хотя я уверен, что если немного подумать, можно найти более элегантное решение.

Это не так, когда у вас большое число (скажем, 103600) и вы хотите получить наименьшее значение для некоторой степени (1036 * 10 ^ 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...