Как преобразовать строку с плавающей точкой в ​​десятичную? - PullRequest
0 голосов
/ 21 октября 2019

Существует много дискуссий о методах преобразования строк с плавающей точкой в ​​десятичную с плавающей точкой, но я не нашел решения своей проблемы в C ++ (у python, C # и т. Д. Есть хорошие и быстрые). Позвольте мне вкратце описать алгоритм.

Сначала мы вводим систему счисления начального числа и вводим число с плавающей точкой в ​​строковую переменную.

int sys = 0;
std::cin >> sys;   //example: 16
string input = ""; 
std::cin >> input; //example: 7ff.12c 

Затем разделите input на right (double) и left (int). Затем вызовите функцию void floatToDec (ввод строки, int sys, флаг char) для обеих этих частей (флаг 'l' означает флаг левой части 'r' означает правую часть). Чтобы сохранить result_int и result_double , мы делаем их глобальными.

Функция:

string alf = { '0','1','2', .. , 'x', 'y', 'z' }
int counter = 0; 
int_temp = 0;
for (int i = size(input); i >= 0; i--){
    int index = indexOf(input[i], alf);
    switch (flag) {
        case 'r':
            result_double += index * pow(sys, counter);
            counter--;
            break;
        case 'l':
            int_temp = result_int + index * pow(sys, counter);
            if (int_temp < 0) {
                result_int = 0;
                return 1; // out of integer borders
            }
            result_int = int_temp;
            counter++;
            break;
      }
}
return 0;

После выполнения функции для обеих частей мы суммируем их. в один поплавок. Эта сумма является результатом

ПРОБЛЕМА

Целочисленная часть этого числа с плавающей запятой не может быть больше, чем целочисленное максимальное значение (2 147 483 647 в декабре), но число с плавающей запятой может быть 2 ^ 38-1 как показатель степени имеет 8 бит. То же самое с двойной, его показатель степени имеет 11 битов, и значение может быть 2 ^ 52-1. (Если я не ошибаюсь).

Итак, как я могу решить эту проблему? Может быть есть другой способ конвертации?

1 Ответ

0 голосов
/ 21 октября 2019
#include <iostream>

int getNumber(char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    else
        return (c - 'a') + 10;
}

int main()
{
    int sys;
    std::cin >> sys;
    std::string s;
    std::cin >> s;

    long long result_int = 0;
    std::string::size_type i = 0;
    while (s[i] != '.')
        result_int = result_int * sys + getNumber(s[i++]);
    ++i;
    long long result_double = 0;
    while (i < s.size())
        result_double = result_double * sys + getNumber(s[i++]);

    std::cout << result_int << ' ' << result_double << std::endl;
}
...