c - 如何使用putchar打印浮点值?

标签 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');
}

如何为 float 创建类似的函数?

最佳答案

这里有一个可能的解决方案:

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”,注意第三位数字的四舍五入。

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

使用此函数时,您应该知道 float 只有 6 个有效数字 的精度,而不是六个小数位。因此,如果您尝试使用 DEC6 打印 123.456,您将在第三位之后得到错误的数字。第 6 位有效数字之后的任何数字都应该被忽略,但是编写代码来考虑这一点在您的应用程序中可能是不必要的,或者考虑到您的限制,您希望的成本更高。

关于c - 如何使用putchar打印浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357212/

相关文章:

c - 为信号量定义变量

c++ - 禁用删除析构函数的生成

我可以在/dev/spidev 文件描述符上选择()吗?

c - 设置了 1 位的位掩码的名称

c - 无法识别的选项“-tree-vectorize”

c - 基于另一个变量设置一组变量的有效方法?

c++ - 为大型项目编写固件时应注意的事项

c - 逆向工程c程序

CMake:使用两个不同的编译器进行交叉编译,但源代码相同

c - (Game Boy Advance) 程序从 0x00000000 而不是 0x08000000 开始。如何告诉 gcc 编译到特定地址?