C++ 不截断双打?

C++ not truncating doubles?

My code:

运行以下代码的结果:

#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。但是,我不明白为什么 double 值比 4.2 稍微。我认为 float 和 double 值只会截断,但似乎 double 值是向上而不是向下舍入。

一般来说,浮点数和双精度数是否四舍五入到最接近的可表示值?花车和双打的轮换方式不同吗?我尝试搜索此内容,但找不到任何相关内容。

浮点值不会截断,它们四舍五入到最接近的可表示值。您发现了一个有趣的示例,其中舍入的方向取决于浮点数的大小,但这并不少见;您可以预期舍入大约有 50% 的时间会上升,而在大约 50% 的时间会下降,一些少量的值可以精确表示并且根本不会四舍五入。例如 4.25 是准确的。