首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用putchar打印浮点值?

如何使用putchar打印浮点值?
EN

Stack Overflow用户
提问于 2010-12-05 11:29:47
回答 3查看 2.7K关注 0票数 3

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

我正在尝试创建一个函数,该函数接受一个浮点数作为参数,并使用putchar()打印它。我有一个类似的函数,可以处理整数值。

代码语言:javascript
复制
void putLong(long x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x >= 10) 
    {
        putLong(x / 10);
    }
    putchar(x % 10+'0');
}

我怎么才能为floats做一个类似的函数呢?

EN

回答 3

Stack Overflow用户

发布于 2010-12-06 06:40:30

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

代码语言:javascript
复制
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') ;
}

您可以这样使用它:

代码语言:javascript
复制
putFloat( 3.14159f, DEC3 ) ;

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-05 11:39:14

您需要的值范围和精度/精度要求是什么?以十进制打印浮点数的精确值是一个非常困难的问题,如果您支持80位或128位的long double值,则需要高达8kb左右的工作空间(可能是2的几次幂;这是我想不到的)。如果你只支持double,你大概可以用1kb左右,如果你只想打印糟糕的近似值,基本上没有工作空间。

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

代码语言:javascript
复制
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位数的数字。:-)

票数 1
EN

Stack Overflow用户

发布于 2010-12-05 11:39:02

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

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

输出小数点。

然后,从浮点数中减去整数以分离小数。现在,对于小数,您可以尝试确定小数后面的位数,或者只是乘以任意大的10的幂,然后从结果整型的右侧去掉无关的0,并再次对结果应用putLong。

我怀疑可能有一种更有效或更简单的方法来做到这一点,但我非常确定这种方法会奏效。查找浮点数的位用于表示指数和值分量的方式也可能很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4357212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档