免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: b_liu
打印 上一主题 下一主题

很简单的printf("%f",5) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-04-08 17:32 |只看该作者
原帖由 antigloss 于 2007-4-8 16:26 发表
和机器使用的是 little-endian 或者 big-endian 也有关系


在这方面与 little-endian 或者 big-endian 没关系

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
32 [报告]
发表于 2007-04-08 17:37 |只看该作者
原帖由 mik 于 2007-4-8 17:31 发表


在这一点上,是无需置疑的,X87寄存器只是起了计算结果临时存放的作用。最终结果还是需要保存在内存中,最终 printf 还是需要从内存中取结果。

难说啊,如果一个编译器的规则说,函数调用的时候,只要传浮点数,就往X87里压,不要往内存压,
函数执行的时候,只要是遇到函数传参是浮点数的,不从内存取,而从X87里取,我看也没啥矛盾啊。
不过有一点,X87里毕竟只能存8个浮点数,再多就不行了。如果调用了几层都带浮点数传参就不好了。不用编译器的规则里可以避免这一点

[ 本帖最后由 cjaizss 于 2007-4-8 17:39 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2007-04-08 17:41 |只看该作者
原帖由 cjaizss 于 2007-4-8 17:37 发表

难说啊,如果一个编译器的规则说,函数调用的时候,只要传浮点数,就往X87里压,不要往内存压,
函数执行的时候,只要是遇到函数传参是浮点数的,不从内存取,而从X87里取,我看也没啥矛盾啊。
不过有一点,X ...


呵呵,没错,一般的函数需要用到浮点数,是可以通过浮点寄存器传递。

发生 I/O 行为时,printf 必定需要从内存中传递!x87浮点指令中是没有输出输入指令的

论坛徽章:
0
34 [报告]
发表于 2007-04-08 20:26 |只看该作者
原帖由 flw2 于 2007-4-8 11:36 发表

用K&R的话说是

C语言的设计思想就是:用C语言程序员知道自己在干什么,唯一的要求就是程序员要明确地表达他们的意图。

C语言不会猜你是想干什么,不会怀疑是否是你表达错了,它假设你是对的,你的例子 ...


这句话真不错

论坛徽章:
0
35 [报告]
发表于 2007-04-08 22:42 |只看该作者
建议使用 -Werror, 该用工具就要用,警告就是隐患。

论坛徽章:
0
36 [报告]
发表于 2007-04-09 09:51 |只看该作者
转换一下类型。
printf("%f\n", (float)5);
printf("%d\n", (int)5.01);

我觉得printf应该是:
int printf(const char * fmt, ...);

我们写的参数,在函数里面根据类型,比如:%d,取int长度的缓冲,换算成int使用。
printf("%d%f", 5, 5.1);

int printf(const char * fmt, ...)
{
    ...
    int * num = (int *)(fmt + 1);

    //输出 *num

    float * flt = (float*)(num + 1);
    //输出 *flt
}

论坛徽章:
0
37 [报告]
发表于 2007-04-09 20:32 |只看该作者

  1. #include <stdio.h>
  2. void main(){
  3.         printf("%f\n",5);
  4.         printf("%d\n",5.01);
  5. }
复制代码

printf("%f\n",5)

浮点数的存储格式与硬件相关吧

论坛徽章:
0
38 [报告]
发表于 2007-04-09 21:52 |只看该作者
原帖由 mik 于 2007-4-8 00:23 发表
1、第一条中,压入整数 5,也就是:0000 0000 0000 0000 0000 0000 0000 0101
    把这个数按浮点数格式来表示,是个极小极小的浮点数,接近0.0 ,故 printf 输出 0.00

2、第二条中,压入5.01 是个浮点数,也 ...

我比较赞同

论坛徽章:
0
39 [报告]
发表于 2007-04-10 15:21 |只看该作者
转一篇“浮点数值的内存结构”,可以了解一下
http://blogger.org.cn/blog/more.asp?name=njucs&id=10145

论坛徽章:
0
40 [报告]
发表于 2007-04-10 15:36 |只看该作者
printf("%f", 5);

本来就是一个BUG,而且还是一个很大的很棘手的BUG。

比如原来有一个帖子问的是在KERNEL中为什么打印出的一个量老是变,还以为是其他地方动态地改了呢。其实就是类似的问题引起。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP