社区
C语言
帖子详情
在可变参数的函数里,为什么float型要提升为Double?
t1397018
2009-11-03 04:57:27
char ,short的整形提升可以理解,为什么float也要提升?
求解
...全文
759
21
打赏
收藏
在可变参数的函数里,为什么float型要提升为Double?
char ,short的整形提升可以理解,为什么float也要提升? 求解
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Excel
函数
100问
函数
的单词都认识,但一用它来写公式,要么写不出来,要么结果不对,更别说编写嵌套公式 那些
函数
名称、
函数
参数
的作用总是记不住,公式总是编制不对; 用Excel多年,还是只会常用的那三五个
函数
。 本次课程结合职场...
c++
可变
参数
列表---
float
问题
我发现在定义
可变
参数
函数
的时候,
float
类
型
得不到正确的结果,查了资料发现如下规则: ``
参数
默认晋级" 规则适用于在
可变
参数
中的
可变
动部分:
参数
类
型
为
float
的总是晋级 (扩展) 到
double
, char 和 short int 晋级到 int。所以 va_arg(arpg,
float
) 是错误的用法。应该总是用 va_arg(arpg,
double
)。 同理, 要用
【转载】C语言中
float
向
double
的
提升
问题,
float
向
double
对阶问题
原文地址:从一个笔试题看C语言中
float
向
double
的
提升
问题作者:lvyilong316 首先看一段来自一个笔试题的程序段:
float
f=1.1;
double
d=1.1; cout<<(f==d)<//0 这段代码输出0,那么为什么同为1.1的doble和
float
不相等呢? 我们知道
float
和
double
比较的时候后发生类
型
提升
,也就是
float
...
scanf,printf输入输出
float
和
double
型
数据
(1)printf的%f说明符既可以输出
float
型
又可以输出
double
型
。 根据“默认
参数
提升
”规则(在printf这样的
函数
的
可变
参数
列表中,不论作用域内有没有原
型
,都适用这一规则)
float
型
会被
提升
为
double
型
。因此printf()只会看到双精度数。 (2)scanf对于
float
类
型
必须用%f,
double
必须用%lf 对于scanf,情况就完全不同了,它接受
可变
参数
函数
详解
https://www.cnblogs.com/clover-toeic/p/3736748.html
可变
参数
函数
又称
参数
个数
可变
函数
(本文也简称变参
函数
),即
函数
参数
数目
可变
。原
型
声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, …); 其中,
参数
可分为两部分:数目确定的固定
参数
和数目
可变
的可选...
C语言
69,391
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章