繁体   English   中英

C ++不能截断双打吗?

[英]C++ not truncating doubles?

我的代码

运行以下代码的结果:

#include <cstdio>

//i define printBits elsewhere but that's not relevant to my question
void printBits(const float f);
void printBits(const double f);

int main(int argc, char **argv) {
  float f=4.2;
  double d=4.2;
  printf("float: %20.20f\n",f);
  printBits(f);
  printf("double: %50.50f\n",d);
  printBits(d);

 return 0;
}

是:

float: 4.19999980926513671875
0    10000001 00001100110011001100110

double: 4.20000000000000017763568394002504646778106689453125
0 10000000001 0000110011001100110011001100110011001100110011001101

注意如何将fd都设置为4.2,但float值略小于4.2,double值略大于4.2。 我理解为什么float值小于4.2;为什么? 4.2的值将被截断为小于4.2的〜2 ^ -21值。 不过,我不明白为什么双值大于4.2 稍大 我以为float和double值会截断,但double值是向上取整而不是向下取整。

通常,浮点数和双精度数是否舍入到最接近的可表示值? 浮球和双打有不同的回合吗? 我尝试搜索此内容,但找不到任何相关内容。

浮点值不会被截断 ,而是四舍五入为最接近的可表示值。 您发现了一个有趣的示例,其中根据浮点的大小四舍五入的方向不同,但这并不罕见。 您可以预计,舍入的时间大约会增加50%,而舍入的时间会减少50%,其中少量的值可以精确表示并且完全不舍入。 例如4.25将是准确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM