如何使用putchar打印浮点值?

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

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

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

我怎么能为浮子做类似的function?

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

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

您需要什么样的数值范围和精度/精度要求? 以十进制forms打印浮点数的精确值是一个非常难的问题,如果你需要高达8 kb左右(我可能会被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。:-)

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

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

输出小数点。

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

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