社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 867|回复: 9

[原创] 浮点数转字符串函数的实现讨论

[复制链接]

5124

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-4-15 04:22:09 | 显示全部楼层 |阅读模式
今晚,还在继续调试我的430+LCD12832的串口屏,不过,遇到了一个小小的麻烦,就是浮点数转成字符串显示的问题,通常都是走snprintf的捷径,但是在小容量单片机面前就失灵了,在使用snprintf函数的时候,会提示空间不足的错误,看来这printf类的函数还是个空间杀手,没办法了,只能自己写个函数实现了。我在此献个小丑,把代码贴出来,代码肯定是存在不足的,例如我说两点:1. 某些数在计算过程中会引入误差,导致输出不准确。如输入-0.1234f,输出会变成-0.12339
2. 小数部分结尾的0没有做特殊处理,不过代码稍微改动一下即可实现。
欢迎大家讨论与指教,有没有更精确的实现方法?
下面贴出代码:
[C] 纯文本查看 复制代码
#include <stdio.h>

void recurParse(int n, char** str, unsigned int* restSize) {
	if (n < 10) {
		if (*restSize > 1) {
			**str = n + '0';
			(*str)++;
			*restSize -= 1;
		}
		
	}
	else {
		recurParse(n / 10, str, restSize);
		if (*restSize > 1) {
			**str = n % 10 + '0';
			(*str)++;
			*restSize -= 1;
		}
	}
}
/*
*outBuffer: 输出字符串的缓冲区
*bufferSize: 输出字符串缓冲区的大小
*in: 要转换的浮点数
*decCount: 输出字符串保留的小数位数
*返回值: 写入到缓冲区中的字符个数(不包含\0)
*/
int float2String(char* outBuffer, unsigned int bufferSize, float in, unsigned int decCount) {
	int n;
	float dec;
	unsigned int restSize = bufferSize;
	if (restSize == 0) return 0;
	n = (int)in;
	dec = in - n;
	if (in < 0) {
		if (restSize > 1 && !(n == 0 && decCount == 0)) {
			*outBuffer++ = '-';
			--restSize;
		}
		n = -n;
	}
	if (dec < 0) {
		dec = -dec;
	}
	recurParse(n, &outBuffer, &restSize);
	if (decCount != 0) {
		if (restSize > 1) {
			*outBuffer++ = '.';
			--restSize;
		}
	}
	while (decCount) {
		dec *= 10;
		n = (int)dec;
		dec -= n;
		if (restSize > 1) {
			*outBuffer++ = n + '0';
			--restSize;
		}
		else {
			break;
		}
		decCount -= 1;
	}
	*outBuffer++ = NULL;
	return bufferSize - restSize;
}

int main() {
	char o[100];
	float test[] = { -123.456, 1987.9998, -0.1234f, -9999.876, 0.1, 0.00002, 0.33, -0.08, -9.99, 10.04, -100.63, 1001.332 };
	int i, n;
	for (i = 0; i < sizeof(test) / sizeof(float); i++) {
		n = float2String(o, sizeof(o)/sizeof(char), test[i], 6);
		printf("%d: %s\n", n, o);
	}
	printf("%f\n", -0.1234f);
	return 0;
}



此内容由EEWORLD论坛网友lcofjp原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自编程基础论坛

评分

1

查看全部评分

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

726

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

爱原创

发表于 2017-4-15 09:58:04 | 显示全部楼层
赞,有空研究一下。


回复

使用道具 举报

737

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-4-15 14:48:00 | 显示全部楼层
在空间有限的处理器上运行递归也不大合适,可以用循环实现,

点评

有道理!  详情 回复 发表于 2017-4-15 15:36
亚里士缺德


回复

使用道具 举报

5124

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

 楼主| 发表于 2017-4-15 15:36:03 | 显示全部楼层
汤权 发表于 2017-4-15 14:48
在空间有限的处理器上运行递归也不大合适,可以用循环实现,

有道理!

点评

你居然用递归?!  详情 回复 发表于 2017-8-11 09:34
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-6-8 13:30:20 | 显示全部楼层
有空研究一下


回复

使用道具 举报

7477

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-8-11 09:33:53 | 显示全部楼层
snprintf生成了多大体积?

点评

不知道,我看不出来,但是我的MCU是8K空间的  详情 回复 发表于 2017-8-11 11:09


回复

使用道具 举报

7477

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2017-8-11 09:34:13 | 显示全部楼层

你居然用递归?!
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

5124

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

 楼主| 发表于 2017-8-11 11:09:45 | 显示全部楼层
辛昕 发表于 2017-8-11 09:33
snprintf生成了多大体积?

不知道,我看不出来,但是我的MCU是8K空间的
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-8-11 11:26:25 | 显示全部楼层
MARK              


回复

使用道具 举报

2470

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-9-25 14:40:28 | 显示全部楼层
本帖最后由 damiaa 于 2017-9-25 15:17 编辑

为了字符串指针移动后位置能被更改用上了 char** str 指针的指针,这样通过指针作为形参可以修改 char *str。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-18 16:30 , Processed in 0.532096 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表