从基数M转换为基数N时的处理分数?

时间:2014-09-14 01:39:03

标签: c++

我试图将任何数字从任何基数M转换为另一个基数N,我在我的代码中所做的是将插入的数字从基数N转换为十进制,然后将其从十进制转换为基数M.代码适用于任何小于37的基数,但它不处理分数。例如,如果输入的分数如1001.01,则转换不会正确显示。任何人都可以帮助我搞清楚我的错误吗?

我的代码:

#include <iostream>

int charToVal(char curChar)
{
    char convArray[] = 
    {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    for(int i=0;i<37; ++i)
    {
        if(curChar==convArray[i])
        {
            return i;
        }
    }
    return -1;
}

char valToChar(int val)
{
    char convArray[] = 
    {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

    if(val <37 && val>=0)
    {
        return convArray[val];
    }
    return ' ';
}

bool convertToDecimal(char * gdstr, int length, int inConvertor, int & decimal)
{
    int factor = 1;
    decimal=0;
    std::cout << length;
    for(int i=length-1; i >=0; --i)
    {
        int curVal(charToVal(gdstr[i]));
        decimal +=  factor*curVal;
        factor*=inConvertor;
    }
    std::cout << decimal << std::endl;
    return true;
}
bool convertFromDecimal(int  decimal, int outConvertor, char * outString, int & length)
{
    int fact = 1;
    length=0;
    while (decimal > 0)
    {
        fact = decimal%outConvertor;        
        char curChar(valToChar(fact));
        outString[length] = curChar;
        decimal/=outConvertor;        
        length++;
    }
    return true;
}

int main()
{


    char out[50];
    int outLeng=0;
    int decVal;
    int inLeng;
    std::cout << "Length of InFormat " ;
    std::cin >>  inLeng;
    char any[inLeng];
    for(int i = 0; i< inLeng; i++)
    {std::cout << "In Format Num "; 
        std::cin >> any[i];}
    int inType;
    std::cout << "In Format Tyep" ; 
    std::cin >> inType;
    int outtype;
    std::cout << "Out Format Tyep" ; 
    std::cin >> outtype;
    convertToDecimal(any, inLeng, inType, decVal);
    convertFromDecimal(decVal, outtype, out, outLeng);
    std::cout << std::endl << "out Type is :" << std::endl;
    for(int i = outLeng-1; i >=0; --i)
    {
        std::cout << out[i];
    }
    std::cout << std::endl;
}

1 个答案:

答案 0 :(得分:2)

要实现的第一件事是,与整数不同,小数值不能总是用有限位数的任意基数表示。例如,值0.1十进制不能精确地以二进制表示。因此,当从具有精确值的原点进行转换时,您可能需要在另一个基础中使用近似值。具体来说,如果目标基数不包括源库的所有素因子,则存在无法准确表示的值:例如,所有二进制分数都可以使用小数部分表示,但并非所有小数部分都可以使用二进制表示级分。

有一对算法用于进行两次转换。它们主要用于将基数10浮点值转换为基数2浮点值并返回到原始基数10值。如果原始值没有使用过多的数字作为近似值,往返将恢复原始值。算法在两篇开创性论文中提出:

  1. How to Read Floating Point Numbers Accurately用于从精确到近似的转换。
  2. How to Print Floating Point Numbers Accurately用于从近似表示转换回原始值。
  3. 具体来说,第二次转换并不像你希望的那样快,并且有改进,特别是Florian Loitsch的{​​{3}}。这些算法有点不重要。 Grisu是算法的实现。