0

有很多关于将浮点数转换为十进制浮点数的方法的讨论,但我没有在 C++ 中找到解决我的问题的方法(python、C# 等有很好和快速的方法)。让我简要描述一下算法。

首先,我们输入初始数字的数字系统,并将浮点数输入到字符串变量中。

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

然后将输入分成(double)和(int)部分然后为这两个部分调用函数void floatToDec(string input, int sys, char flag)(标志'l'表示左部分标志'r'表示右部分) . 为了保存result_intresult_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;

在为这两个部分执行函数之后,我们将它们相加。成一个浮子。这个总和就是结果

问题

此浮点数的整数部分不能超过整数最大值(dec 中的 2,147,483,647),但浮点数可以是 2^38-1,因为指数有 8 位。与 double 相同,它的指数有 11 位,值可以是 2^52-1。(如果我没记错的话)。

那么,我该如何解决这个问题?可能有另一种转换方式吗?

4

1 回答 1

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;
}
于 2019-10-21T14:05:29.650 回答