int main(){
int s=200;
printf("%.12f",s/3.0);
}
即使float只能支持6-7位小数,这个程序如何给出66.666666666667的输出?
同时,
int main(){
float s=200;
printf("%.12f",s/3);
}
给了66.666664123535。
请帮帮忙?
发布于 2021-01-02 18:33:29
第一个程序中没有任何float
。%f
是double
,3.0
也是double
。double
类型的精度约为16位小数。在第二个程序中,对于可变函数,float
被提升为double
,但并没有神奇地获得更高的精度。
摘自C11§6.4.4.2
4无后缀的浮点常量具有双精度类型。如果以字母F或F作为后缀,则其类型为float。如果以字母L或L作为后缀,则它的类型为long double。
和C11§6.5.2.2
6如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,并将类型为的浮点型参数提升为双精度。
7如果表示被调用函数的表达式具有包含原型的类型,则将参数隐式转换为相应参数的类型,就像通过赋值一样,将每个参数的类型视为其声明类型的未限定版本。函数原型声明程序中的省略号表示法会导致参数类型转换在最后声明的参数之后停止。在尾随参数上执行默认参数提升。
发布于 2021-01-02 16:31:19
如果没有精度,它将被认为是6。否则,如果你指定了精度,它将接受精度。
引用C11
,第7.21.6.1/P8章,(重点是我的)
f,F
表示浮点数的双参数将转换为-ddd.ddd,样式的小数表示法,其中小数点字符后的位数等于精度规范。如果缺少精度,则取6; ...
https://stackoverflow.com/questions/65537238
复制相似问题