首页 > 试题广场 > 关于C语言中的float,下面哪种说法是正确的? ()
[单选题]

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

  • x^2 >= 0 对于float变量x总成立
  • float 变量加法满足交换律
  • 条件0.9f == 0.9 的值为真
  • 条件9 == 0.9*10 的值为真
看A选项的时候都懵了,因为c里面没有这个东西,  后来查了一下资料, 发现html中, >是代表大于号>的意思,我觉得这里A选项本来一个是x^2 >= 0, 但是因为浏览器的原因, 显示出了> 如果题目是X^2 >=0也就是,x异或大于或等于0


如果有错, 欢迎交流, 毕竟我是个菜鸡...
发表于 2019-07-29 16:10:46 回复(3)
先说结论:A选项正确,但是选项的表示有歧义;
题目不规范,nowcoders两行泪啊!

1、C/C++中浮点数由符号位、阶码和尾数构成,其二进制表示并不直接对应浮点数的大小,因此浮点数类型不能进行位运算否则编译器报错;所以如果A选项正确,其指的应该是x的二次幂;而不是x与2进行逐位异或......
拜托题目上传者把选项写清楚,复制时正确替换HTML的特殊符号,“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>
const double EPS = 1e-8; //1e-7
//不能用返回值为int的库函数abs()
const double abs_f(const double &a, const double &b)
{ return (a-b)>0 ? (a-b) : (b-a); }
int main()
{
    //代码输出 True: 9 == 0.9*10;
    //若放宽精度至1e-7,则两个表达式都为真
    if(abs_f(0.9f, 0.9) < EPS) puts("True: 0.9f == 0.9");
    if(abs_f(9, 0.9*10) < EPS) puts("True: 9 == 0.9*10");
    return 0;
}
编辑于 2019-10-08 14:51:38 回复(0)
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 回复(0)
浮点数类型不能进行位运算
发表于 2019-10-29 15:40:25 回复(0)
第一个什么意思啊  没看懂
发表于 2019-07-24 16:22:24 回复(0)

热门推荐