OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11639|回复: 22

在程序里面的sprintf()的函数取不了%f的值,取出来为0

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
发表于 2015-7-21 16:17:27 | 显示全部楼层 |阅读模式
5金钱
unsigned char number[20] = {0};
float sum_float = 0;
sum_float = 1524.45;
UARTSend(uart0_id, "float = ", 8);
sprintf((char *)number,"%.2f",sum_float);
UARTSend(uart0_id, number, 20);
sprintf函数转换其他的都正常,但是转换浮点数时出现的结果是0.00,这是为什么啊?
后面我自己写了一个sprintf的,
case 'f':
                    UARTSend(uart0_id, "in float", 8);
                    float_num = (float)va_arg(ap, double);
                    int_num = (int)float_num;
                    UARTSend(uart0_id, (unsigned char*)&int_num, 2);
                    bias = float_num - int_num;
va_arg(ap, double);的结果页是0,请教为什么。

最佳答案

查看完整内容[请看2#楼]

定义sum_float为8字节对其。 __align(8) float sum_float = 1524.45;
新手,求助
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-7-21 16:17:28 | 显示全部楼层
定义sum_float为8字节对其。

__align(8) float sum_float = 1524.45;
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-7-21 17:24:25 | 显示全部楼层
1524.45f 試試
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
 楼主| 发表于 2015-7-23 12:02:26 | 显示全部楼层
回复【2楼】Rocks:
---------------------------------
不行的,该试的都试了。
新手,求助
回复

使用道具 举报

0

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2014-1-6
在线时间
60 小时
发表于 2015-7-23 15:14:33 | 显示全部楼层

用sprintf 打印浮点数时,一定要注意设置堆栈8字节对对齐,否则就会出现数值是零的情况。

回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-7-23 16:14:22 | 显示全部楼层
用printf(("%.2f",sum_float);试试。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
 楼主| 发表于 2015-7-24 14:49:01 | 显示全部楼层
回复【4楼】suiji008:
---------------------------------
怎么设置堆栈8字节对齐?
新手,求助
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
 楼主| 发表于 2015-7-24 14:56:54 | 显示全部楼层
回复【6楼】Theone:
---------------------------------
结果还是0.00000
 __align(8) float sum_float = 1524.45;
    unsigned char number[10] = {0};
    len = com_recv_string(lable_buffer,0x0d);
    error = set_data(lable_buffer, len, 1); 

    label.x_size = argu[0].int_data;
    label.y_size = argu[1].int_data;
    sprintf((char *)number,"%f",sum_float);
    UARTSend(uart0_id,"set size", 8);
    UARTSend(uart0_id,number, 8);
新手,求助
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-7-24 19:38:48 | 显示全部楼层
回复【8楼】xnandoux:
---------------------------------
这是见鬼了?我在我板子上试了一下,不加对齐也能正常输出,你看看sprintf转换完以后的number里边有没有内容,如果有检查UARTSend,如果转换出来的没有内容的话我也不知道该怎么处理了。

sprintf((char*)a,"%5.2f",b);
要不试试这样。。。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
 楼主| 发表于 2015-8-13 09:58:53 | 显示全部楼层
回复【9楼】Theone:
---------------------------------
转换出来的只有整数部分,小数部分会消失。
新手,求助
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-8-13 11:29:28 | 显示全部楼层
回复【10楼】xnandoux:
---------------------------------
实在不行换float试试看吧  我也不知道该怎么解决了。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
 楼主| 发表于 2015-8-13 14:18:37 | 显示全部楼层
回复【11楼】Theone:
---------------------------------
我也是见鬼了,就是不行,现在我用自己写的一个简单的来用。
新手,求助
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-31
在线时间
5 小时
发表于 2016-3-14 22:11:23 | 显示全部楼层
可以尝试在target中不勾选use microLIB试试
好多问题不会呀。。。。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-2-19
在线时间
18 小时
发表于 2016-3-15 12:48:52 | 显示全部楼层
我在emWin里面也遇到相同问题,是不是在UCOS和EMWIN里才有这样的问题?
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-3-15 16:37:55 | 显示全部楼层
sprintf((char *)number,"%05.2f",sum_float);
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

68

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-6-27
在线时间
8 小时
发表于 2016-7-4 14:22:30 | 显示全部楼层
问题解决了吗?我遇到这个问题一年了,没能解决,前段时间已经写出来了,后来没保存好,现在有调不出来,感觉之前就是在做梦
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-4-1
在线时间
5 小时
发表于 2017-8-7 20:23:51 | 显示全部楼层
跑了UCOS的话,任务堆栈8字节对齐就可以了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-4-1
在线时间
5 小时
发表于 2017-8-7 20:24:38 | 显示全部楼层
__align(8) OS_STK         DATA_SHOW_STK[DATA_SHOW_STK_SIZE]; 类似这样的就可以解决这个问题
回复

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2015-8-12
在线时间
19 小时
发表于 2017-8-23 12:00:07 | 显示全部楼层
我也遇到这个问题了,在工程文件里面调用封装函数,里面用到了sprintf函数,开始是出来0,后来可以出来数字了,但是小数点显示e,后加载本地资源调用函数,小数点不显示了  直接是空格
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2017-8-23 13:52:45 | 显示全部楼层
貌似sprintf 不能%f  而是%lf,一直这么用,出来没出问题
回复

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2017-8-23 17:49:59 | 显示全部楼层
可能是软件不支持,网上有一种方法是拆开转换: sprintf( (char*)number, "%d.%02d", (unsigned int )sum_float, (unsigned int)((sum_float - (unsigned int)a)  * 100);
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4370
金钱
4370
注册时间
2017-5-30
在线时间
579 小时
发表于 2017-11-26 10:58:14 | 显示全部楼层
同样的问题
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2018-1-3
在线时间
7 小时
发表于 2018-8-17 14:38:45 | 显示全部楼层
本帖最后由 superheasy 于 2018-8-17 14:39 编辑

应该是支持库的问题。
IDE是trueSTUDIO,环境默认是调用Newlib-nano,改为Newlib-standard就好了。。。。。

Differences between Newlib and Newlib-Nano include:

  • Newlib-Nano is optimized for size.
  • The printf and scanf family of routines have been re-implemented in Newlib-Nano to remove a direct dependency on the floating-point input/output handling code. Projects that need to handle floating-point values using these functions must now explicitly request the feature during linking, as described above.
  • The printf and scanf family of routines in Newlib-Nano support only conversion specifiers defined in C89 standard. This provides a good balance between small memory footprint and full feature formatted input/output.
  • Newlib-Nano removes the now redundant integer-only implementations of the printf/scanf family of routines (iprintf/iscanf, etc). These functions now alias the standard routines.
  • In Newlib-Nano, only unwritten buffered data is flushed on exit. Open streams are not closed.
    In Newlib-Nano, the dynamic memory allocator has been re-implemented

回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 15:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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