首页 > 试题广场 >

关于C语言中的float,下面哪种说法是正确的? ()

[单选题]

关于C语言中的float,下面哪种说法正确的是 ()

  • x的二次方大于等于0,对于float变量x总成立
  • float 变量加法满足交换律
  • 条件0.9f == 0.9 的值为真
  • 条件9 == 0.9*10 的值为真
先说结论:A选项正确

1、C/C++中浮点数由符号位、阶码和尾数构成,其二进制表示并不直接对应浮点数的大小,因此浮点数类型不能进行位运算否则编译器报错;所以如果A选项正确,其指的应该是x的二次幂;而不是x与2进行逐位异或......
拜托题目上传者把选项写清楚,复制时正确替换HTML的特殊符号(即"&gt"应改为大于号">"),“x^2”应该明确写成“x * x”或“x的二次方”或其他不会导致歧义的形式。
2、 B不一定正确。虽然浮点数标准IEEE 754满足加法和乘法的交换律,不满足加法结合律,但是C++标准不保证IEEE 754标准的实现,于是C++编译器也不保证浮点数a+b的结果等于b+a,体参见 https://stackoverflow.com/questions/24442725/is-floating-point-addition-commutative-in-c 以及《深入理解计算机系统(第三版)》2.4.5节,浮点运算。

3、C、D错误。浮点数存在误差,直接比较大小往往不是预期的结果;通常引入一个比要求精度还要小几个数量级的实数epsilon来帮助比较大小。在我的机器上,精度取1e-8,0.9f == 0.9为假(0.9f是单精度浮点,精度比0.9低):
#include<cstdio>
#include<cmath> //fabs(),返回浮点数的绝对值
const double EPS = 1e-8; //1e-7
int main()
{
    //代码输出 True: 9 == 0.9*10;
    //若放宽精度至1e-7,则两个表达式都为真
    if(fabs(0.9f - 0.9) < EPS) puts("True: 0.9f == 0.9");
    if(fabs(9 - 0.9*10) < EPS) puts("True: 9 == 0.9*10");
    return 0;
}
编辑于 2021-03-26 10:26:15 回复(3)
更多回答
float类型不满***换律。 比如(1e20+(-1e20))+3.14=3.14,前两项很明显得0,所以结果为3.14。 但如果交换顺序(1e20+((-1e20)+3.14)),很明显后两项里3.14比-1e20的绝对值小很多,后两项结果为-1e20,最终整个式子的结果为0。 所以float类型不满***换律
发表于 2019-10-30 20:45:16 回复(4)
第一个什么意思啊  没看懂
发表于 2019-07-24 16:22:24 回复(0)
但是 a 答案当一个数据的大于 float 的大小,时相乘会不会出现负数(请指教)
发表于 2023-09-07 12:42:07 回复(0)
A选项 可是X的二次方足够大的时候,存进去会会是正数吗,求指正
发表于 2021-12-16 19:21:18 回复(0)
浮点数类型不能进行位运算
发表于 2019-10-29 15:40:25 回复(0)
有精度损失。
发表于 2022-01-08 19:48:39 回复(0)
b
发表于 2020-07-25 15:39:29 回复(1)