未存储在变量中的数字类型

时间:2018-12-17 12:20:40

标签: c

我对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)调用函数,该部门如何处理?看来它是用双精度计算出来的,然后转换为浮点数。为什么呢

这是一个很长的问题,希望有人能帮助我理解它。

3 个答案:

答案 0 :(得分:3)

  

...未存储在变量中的数字

它们被称为“常量”。

  • 任何不带后缀的浮点常量的类型为double

    引用C11,第6.4.4.2章

      

    不带后缀的浮点常量的类型为double。如果以字母fF结尾,   输入float。如果以字母lL结尾,则其类型为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