0

There are many discussions on methods of conversion strings with float to decimal float, but i didn't find solution of my problem in C++ (python, C#, etc. have nice & quick ones). Let me describe algorithm in brief.

Firstly, we enter number system of initial number and enter float number into string variable.

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

Then divide input into right (double) and left (int) parts Then call function void floatToDec(string input, int sys, char flag) for both of these parts (flag 'l' means left part flag 'r' meens right part). To save result_int and result_double we make them global.

Function:

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;

After executing function for both parts we sum them. into one float. This sum is the result

PROBLEM

Integer part of this float can't be more than integer max value (2,147,483,647 in dec) but float can be 2^38-1 as exponent has 8 bits. Same with double, its exponent has 11 bits and value can be 2^52-1. (If i'm not misstaken).

So, how can i solve this issure? May be there is another way to convert?

John Kugelman
  • 349,597
  • 67
  • 533
  • 578

1 Answers1

0
#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;
}
srt1104
  • 959
  • 7
  • 11