如何使用putchar打印浮点值?

时间:2010-12-05 03:29:47

标签: c embedded

我正在开发一个嵌入式应用程序,需要打印浮点值。由于空间和其他限制,我只能使用putchar()进行输出。

我正在尝试创建一个函数,它将float作为参数并使用putchar()打印它。我有一个类似于整数值的函数。

void putLong(long x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x >= 10) 
    {
        putLong(x / 10);
    }
    putchar(x % 10+'0');
}

我怎样才能为花车做类似的功能?

3 个答案:

答案 0 :(得分:2)

这是一个可能的解决方案:

typedef enum
{
    DEC1 = 10,
    DEC2 = 100,
    DEC3 = 1000,
    DEC4 = 10000,
    DEC5 = 100000,
    DEC6 = 1000000,

} tPrecision ;

void putFloat( float f, tPrecision p )
{
    long i = (long)f ;
    putLong( i ) ;
    f = (f - i) * p ;
    i = abs((long)f) ;
    if( fabs(f) - i >= 0.5f )
    {
        i++ ;
    }
    putchar('.') ;
    putLong( i ) ;
    putchar('\n') ;
}

你会这样使用它:

putFloat( 3.14159f, DEC3 ) ;

将输出“3.142”,注意第三位数的四舍五入。

如果您只需要固定数量的小数位,则可以取消精度参数并对其进行硬编码。

使用此功能时,您应该知道浮点数只有6个有效数字的精度,而不是6个小数位。因此,如果您尝试使用DEC6打印说123.456,您将在第三位之后得到错误的数字。应该忽略第6位有效数字之后的任何数字,但是在您的应用程序中编写代码以考虑到这一点可能是不必要的,或者考虑到您的约束,您希望更昂贵。

答案 1 :(得分:1)

您需要什么样的数值范围和精度/精度要求?以十进制形式打印浮点数的确切值是一个非常难的问题,如果你需要高达8 kb左右(我可能会被2的2次幂关闭;这是我的头脑中)支持80位或128位long double值。如果你只支持double,你可能只需要1 kb左右,如果你只想打印不良的近似值,基本上没有工作空间。

好的,所以这是一个非常基本的版本:

void putDouble(double x, int p)
{
    long d;
    if (x<0) {
        putchar('-');
        x=-x;
    }
    d = x;
    putLong(d);
    putchar('.');
    while (p--) {
        x = (x - d) * 10;
        d = x;
        putchar('0'+d);
    }
}

您可能希望修复putLong以处理超过2位的数字,2: - )

答案 2 :(得分:0)

我认为我的主要方法是将float值的整数部分与小数部分分开。

如果你可以使用某种舍入或转换为整数函数,你可以使用你已经拥有的putLong方法输出整数部分。

输出小数点。

然后,从float中减去该int以隔离小数。现在,对于小数,您可以尝试确定小数点后的位数,或者只是乘以10的任意大的幂,然后从结果int的右侧剥去无关的零并再次应用putLong为了结果。

我怀疑可能有更高效或更简单的方法来做到这一点,但我很确定这种方法可行。查看float的位用于表示指数和值组件的方式也很有用。