C++ 从M基转换到N基时的处理分数?

C++ 从M基转换到N基时的处理分数?,c++,C++,我试图将任意数字从任意基数m转换为另一个基数N,我在代码中所做的是将插入的数字从基数N转换为十进制,然后将其从十进制转换为基数m。我的代码适用于任何小于37的基数,但它不处理分数。例如,如果输入具有类似1001.01的分数,则转换结果不正确。有人能帮我找出我的错误吗 我的代码: #include <iostream> int charToVal(char curChar) { char convArray[] = {'0','1','2','3','4','5',

我试图将任意数字从任意基数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;
}
#包括
int chartova(char curChar)
{
字符数组[]=
{'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'};
对于(int i=0;i any[i];}
int型;
std::cout>inType;
int-outtype;
std::cout>outtype;
convertToDecimal(any、inLeng、inType、decVal);
convertFromDecimal(decVal、outtype、out、outLeng);

std::cout首先要认识到的是,与整数不同,分数值不能总是用有限位数的任意基数表示。例如,0.1十进制值不能用二进制精确表示。因此,当从具有精确值的原始基数转换时,可能需要在另一个基数中使用近似值具体来说,如果目标基不包括源基的所有素数因子,则存在无法准确表示的值:例如,所有二进制分数都可以使用十进制分数表示,但并非所有十进制分数都可以使用二进制分数表示

有一对算法用于进行两次转换。它们主要用于将基数为10的浮点值转换为基数为2的浮点值,然后再转换回原始的基数为10的值。假设原始值没有使用过多的数字作为近似值,则往返过程将恢复原始值。下面介绍了这些算法d在两篇开创性论文中:

  • 用于从精确表示转换为近似表示
  • 用于从近似表示转换回原始值

  • 具体来说,第二次转换没有您希望的那么快,并且有一些改进,特别是Florian Loitsch的。算法有些复杂。是算法的实现。

    尝试使用调试器“转换结果不正确”-你应该在你的帖子中包括你得到的输出和你期望的输出。你可以直接这样做,不需要通过十进制。你的问题不是关于浮点,而是关于处理小数部分。如何直接这样做?你的两个
    convArray
    (略)浪费,因为它们在每次调用时都在每个函数中初始化。您可以在文件范围内使它们
    static const char convArray[]
    ,以便它们在程序启动时初始化一次,然后简单地使用。