我对C代码中的一些数字有些困惑。我有以下一段代码
int k;
float a = 0.04f;
for (k=0; k*a < 0.12; k++) {
* do something *
}
在这种情况下,“ 0.12”的类型是什么?双倍?浮动?它从未在任何地方声明。无论如何,即使3 * 0.04 = 0.12 <0.12是不正确的,在我的程序中上述循环也执行了4次。一旦我用0.12F交换了0.12(因为我在所有程序中都被限制为浮点精度),则循环现在执行3次。我不明白为什么,这里发生了什么。是否有关于如何编写此类语句以免发生意外问题的适当准则?
另一个相关问题如下:在变量的定义中,说
float b = 1/180 * 3.14159265359;
在这种情况下,“ 1”到底是什么?和“ 180”?整数?它们会转换为浮点数吗?这样写可以吗?还是应该为“ 1.0f / 180.0f * 3.14159265359f;”
问题的最后一部分
如果我有功能
void testfunction(float a)
这可以做些事情。
如果我用testfunction(40.0 / 6.0)调用函数,该部门如何处理?看来它是用双精度计算出来的,然后转换为浮点数。为什么呢
这是一个很长的问题,希望有人能帮助我理解它。
答案 0 :(得分:3)
...未存储在变量中的数字
它们被称为“常量”。
任何不带后缀的浮点常量的类型为double
。
引用C11
,第6.4.4.2章
不带后缀的浮点常量的类型为
double
。如果以字母f
或F
结尾, 输入float
。如果以字母l
或L
结尾,则其类型为long double
。
对于Integer常量,类型取决于值。
引用C11
,第6.4.4.1章
整数常量的类型是对应列表的第一个,其值可以在其中 被代表。 [..]
对于不带后缀的十进制数字,列表为
int long int long long int
关于浮点数的数学运算精度,see this post
答案 1 :(得分:1)
“ 0.12”是一个常数,是的,如果没有尾随f或F,它将被解释为双精度。
该数字不能完全表示为二进制分数。比较k * a
时,结果是浮点数,因为两个操作数都是浮点数。结果略小于0.12,但是当您与双精度数进行比较时,它会被零填充为所需的大小,这会增加差异。当使用浮点常量时,不会填充(强制转换)结果,而且很幸运,得出的结果与“ 0.12f”的二进制表示形式完全相同。对于更复杂的操作,情况可能并非如此。
答案 2 :(得分:0)
如果我们使用小数,例如3.4
,则默认为double。如果希望将其视为单精度(浮点数),则应像3.4f
一样明确指定它。
如果您调用以下函数
int fun()
{
float a= 1.2f;
double b = 1.2;
return (a==b);
}
这将始终返回零(false)。因为在进行比较之前,float类型会转换为double(较低的类型转换为较高的类型),这时有时无法重现精确的1.2,因此值可能会略有变化从小数点后第六位开始发生。您可以通过以下打印语句检查差异
printf("double: %0.9f \n float: %0.9f\n",1.2,1.2f);
结果很像
double: 1.200000000
float: 1.200000481