C++ C++;不截断双打?

C++ C++;不截断双打?,c++,floating-point,double,precision,floating-accuracy,C++,Floating Point,Double,Precision,Floating Accuracy,: 运行以下代码的结果: #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("flo

:

运行以下代码的结果:

#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;
}
请注意,我是如何将
f
d
都设置为4.2的,但浮点值略小于4.2,双精度值略大于4.2。我理解为什么浮点值小于4.2;4.2值被截断为小于4.2的值~2^-21。但是,我不明白为什么double值略大于4.2。我认为float和double值只是截断,但double值似乎是向上舍入而不是向下舍入


通常情况下,是否将浮点和双精度舍入到最接近的可表示值?花车和双人轮换是否不同?我已尝试搜索此项,但找不到任何相关内容。

浮点值不会被截断,而是四舍五入到最接近的可表示值。您已经发现了一个有趣的例子,根据浮点的大小,舍入的方向不同,但这并不少见;您可以预期舍入在大约50%的时间内上升,在大约50%的时间内下降,其中一些值是完全可表示的,根本不舍入。例如,4.25将是精确的。

浮点值不会被截断,而是四舍五入到最接近的可表示值。您已经发现了一个有趣的例子,根据浮点的大小,舍入的方向不同,但这并不少见;您可以预期舍入在大约50%的时间内上升,在大约50%的时间内下降,其中一些值是完全可表示的,根本不舍入。例如,4.25是精确的。

如果你包含<代码> <代码>,你在C++中工作,而不是C。你肯定是在C++中工作,而不是C。不要用错误的语言来标记它——这会使人厌烦,导致投票失败。希望有人能解释一下4.2是如何不能精确地表示为二进制浮点的,但这就是原因。有一个标准的交叉引用问答,答案是否定的,但它不一定是你期望的方式。如果你包含了<代码> /COD>,你在C++中工作,而不是C。你肯定是在C++中工作,而不是C。不要用错误的语言来标记它——这会使人厌烦,导致投票失败。希望有人能解释一下4.2是如何不能精确地表示为二进制浮点的,但这就是原因。这里有一个标准的交叉参考问答,答案是否定的,但它不一定按照你期望的方式工作。我认为容易可视化的例子可能会很有用。例如,如果
float
可以表示0、¼、½、¾和1,
double
可以表示0,⅛, ¼, ⅜, ½, ⅝, ¾, ⅞, 和1,然后将.6转换为
float
将四舍五入到½(接近.5而不是.75),但将.6转换为
double
将四舍五入到⅝ (接近0.625而不是0.5)。我认为易于可视化的示例可能很有用。例如,如果
float
可以表示0、¼、½、¾和1,
double
可以表示0,⅛, ¼, ⅜, ½, ⅝, ¾, ⅞, 和1,然后将.6转换为
float
将四舍五入到½(接近.5而不是.75),但将.6转换为
double
将四舍五入到⅝ (接近0.625而不是0.5)。
float: 4.19999980926513671875
0    10000001 00001100110011001100110

double: 4.20000000000000017763568394002504646778106689453125
0 10000000001 0000110011001100110011001100110011001100110011001101