在可变参数的函数里,为什么float型要提升为Double?

t1397018 2009-11-03 04:57:27
char ,short的整形提升可以理解,为什么float也要提升?
求解
...全文
759 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq695958771 2012-01-15
  • 打赏
  • 举报
回复
能确保精度
栗豆 2010-08-26
  • 打赏
  • 举报
回复
跟楼主有同样的困扰.........
觉得运算中double并不比float精度高多少
leopardaa521 2009-11-04
  • 打赏
  • 举报
回复
mark
ForestDB 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 t1397018 的回复:]
各位没明白我的意思吗?
我不是问精度的问题,Double比Float高谁都知道
举个例子
float f;
printf("%f", f);
printf在处理f时会将f先提升为double型,我问的是为什么这么做?
f的类型在变量声明时已经确定了,精度那是使用这个函数的人的事,他要的就是打印一个单精度的浮点数,没必要提高精度

[/Quote]
我觉得LZ的理解有些偏差,这里实际上是%f需要一个double,而不是float,你传进一个float,自然会被提升成double。
avalon 2009-11-04
  • 打赏
  • 举报
回复
貌似这个问题好复杂。。我坐看高手!
2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gernal_dn 的回复:]
这实际上与CPU的发展史密切相关。从486将数学协处理器整合进CPU里开始,CPU内部的所有浮点运算都是双精度的,向下兼容单精度也会自动转成双精度,float对CPU而言失去意义。而后,随着处理电路的改良,浮点运算中,除了“除法”都可以在一个时钟周期内完成,这一来,对C/C++编译器而言,编写标准数学库时就失去单独为float独立编个库的必要了。当然,float在特别场合也有存在的必要,但那需要另¡­
[/Quote]
似乎 CPU 内部的所有浮点运算都是扩展双精度的,就是 gcc 里面 long double 的长度~
从这个角度说,float 和 double 都没什么意义了……

另外,short + short 是 int,short 传参的时候要提升为 int;float 传参的时候要提升为 double,float + float 却是 float 而不是 double……好乱……
为什么只有函数调用需要提升浮点呢?
2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 forestdb 的回复:]
我觉得LZ的理解有些偏差,这里实际上是%f需要一个double,而不是float,你传进一个float,自然会被提升成double。
[/Quote]
没有偏差,%f 之所以可以同时输出 float 和 double 就是因为 float 会自动提升为 double,C 的输入输出不是类型安全的,不能自动进行类型调整,就算编译器看出来错误也只能发个警告。例如这里传进去一个 int 是不会提升为 double 的。
gernal_dn 2009-11-03
  • 打赏
  • 举报
回复
这实际上与CPU的发展史密切相关。从486将数学协处理器整合进CPU里开始,CPU内部的所有浮点运算都是双精度的,向下兼容单精度也会自动转成双精度,float对CPU而言失去意义。而后,随着处理电路的改良,浮点运算中,除了“除法”都可以在一个时钟周期内完成,这一来,对C/C++编译器而言,编写标准数学库时就失去单独为float独立编个库的必要了。当然,float在特别场合也有存在的必要,但那需要另外的库来支持,比如嵌入式芯片/单片机,还有一个就是GPU,(double占内存比float翻倍,这个对于CPU而言可以忽略的问题,在GPU上表现特别严重,所以,GPU为float和double各设计有一套电路的)
huqinglu123 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 t1397018 的回复:]
各位没明白我的意思吗?
我不是问精度的问题,Double比Float高谁都知道
举个例子
float f;
printf("%f", f);
printf在处理f时会将f先提升为double型,我问的是为什么这么做?
f的类型在变量声明时已经确定了,精度那是使用这个函数的人的事,他要的就是打印一个单精度的浮点数,没必要提高精度

[/Quote]
前段时间也听说过这件事,我觉得这是编译器的事,原因就不清楚了
pang123hui 2009-11-03
  • 打赏
  • 举报
回复
还有需要记住的一点就是对于那些编译器设计者来说:效率(几乎)等于一切,一切向效率看齐
pang123hui 2009-11-03
  • 打赏
  • 举报
回复
LZ没看看《C专家编程》吗?

是这样的:

如果传递的是一个float,函数实际接到的是double,在被调用函数的函数体内,这些值会根据函数定义时参数的声明类型自动裁剪为该类型。

至于为什么要不嫌麻烦的将它们提升为更大的类型,然后又直接把它们裁剪为原来的大小,是因为要简化编译器——所有的东西都是同一长度。如果只固定使用几种类型,将大大简化参数的传递,尤其是在非常老式的
K&R C编译器中(不能传递struct作为参数)。
小小攻城师 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 t1397018 的回复:]
各位没明白我的意思吗?
我不是问精度的问题,Double比Float高谁都知道
举个例子
float f;
printf("%f", f);
printf在处理f时会将f先提升为double型,我问的是为什么这么做?
f的类型在变量声明时已经确定了,精度那是使用这个函数的人的事,他要的就是打印一个单精度的浮点数,没必要提高精度

[/Quote]
我见一本书上写c++说double的类型运算不比float慢多少,甚至有时候比float都要快
所以 很多书上推荐的都是用double
比如很经典的一些c++教材都是这样写的
至于c是不是我就不太清楚了
2009-11-03
  • 打赏
  • 举报
回复
这个我也没想清楚……
但是有一点是肯定的,一个浮点字面量不加类型后缀就是 double,可见 C/C++ 语言对于 double 有某种原因的情有独钟~~
不过有一点是非常“不和谐”的,在算术运算的时候,int 以下的整形全部要提升成 int,浮点数却不用全部转成 double,函数传参的时候 float 又要提升……
有段时间我曾经把算术运算的默认提升和函数传参的提升弄混了……
kxalpah 2009-11-03
  • 打赏
  • 举报
回复
不太清楚,真的是提升么?不是都可以吗
t1397018 2009-11-03
  • 打赏
  • 举报
回复
各位没明白我的意思吗?
我不是问精度的问题,Double比Float高谁都知道
举个例子
float f;
printf("%f", f);
printf在处理f时会将f先提升为double型,我问的是为什么这么做?
f的类型在变量声明时已经确定了,精度那是使用这个函数的人的事,他要的就是打印一个单精度的浮点数,没必要提高精度
phpjspasp 2009-11-03
  • 打赏
  • 举报
回复
float精度相当低,只有六七位小数。
double有十五位小数。差不多是float的两倍。(所以叫double, 双精度)
double精度高,所以要提升
jzd8000 2009-11-03
  • 打赏
  • 举报
回复
为了保证更大的精确性
selooloo 2009-11-03
  • 打赏
  • 举报
回复
精度问题
lylm 2009-11-03
  • 打赏
  • 举报
回复
哪个函数?需要的参数是double吧
admirxue 2009-11-03
  • 打赏
  • 举报
回复
单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.

知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。

对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
加载更多回复(1)

69,391

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧