C++ 用C/C+中的%f确定浮点输出(打印)+;

C++ 用C/C+中的%f确定浮点输出(打印)+;,c++,c,math,floating-point,C++,C,Math,Floating Point,我之前在中讨论过浮点数,但这并没有澄清我的问题,我知道这个浮点数问题可能在每个论坛都很常见,但我的问题不是关于浮点数算术或比较。我对它的表示和输出与%f相当好奇。 问题很简单:“如何确定的准确输出: float = <Some_Value>f; printf("%f \n",<Float_Variable>); f1 = 43.200001 f2 = 23.700001 f3 = 58.889999 f4 = 0.700000 输出: float = <

我之前在中讨论过浮点数,但这并没有澄清我的问题,我知道这个浮点数问题可能在每个论坛都很常见,但我的问题不是关于浮点数算术或比较。我对它的表示和输出与%f相当好奇。

问题很简单:“如何确定的准确输出:

float = <Some_Value>f;     
printf("%f \n",<Float_Variable>);
f1 = 43.200001
f2 = 23.700001
f3 = 58.889999
f4 = 0.700000
输出:

float = <Some_Value>f;     
printf("%f \n",<Float_Variable>);
f1 = 43.200001
f2 = 23.700001
f3 = 58.889999
f4 = 0.700000
我知道%f(表示double)的默认精度为6,我也知道这个问题(在本例中)可以通过使用double来解决,但我想知道float中的输出
f2=23.700001
f3=58.889999

EDIT:我知道浮点数无法精确表示,但获取最接近的可表示值的规则是什么?

谢谢,

你可能也有兴趣看到其他人对这一点提出疑问

也请看一看

你可能也有兴趣看到其他人对这一点提出疑问

也请看一看


您可以通过在格式说明符中包含小数点来控制输出的小数点数量

因此,与其

float f = 43.2f,
printf("f1 = %f\n",f);
有这个吗

float f = 43.2f,
printf("f1 = %.2f\n",f);
在小数点后打印两个数字


请注意,浮点数字不能在内存中精确表示。

您可以通过将其包含在格式说明符中来控制输出的小数点的数量

因此,与其

float f = 43.2f,
printf("f1 = %f\n",f);
有这个吗

float f = 43.2f,
printf("f1 = %.2f\n",f);
在小数点后打印两个数字

请注意,浮点数不能在内存中精确表示。

编译器和CPU用于表示内存中的浮点值。大多数有理数不能用这种格式精确表示,因此编译器选择最接近的近似表示

为了避免不可预测的输出,您应该四舍五入到适当的精度

// outputs "0.70"
printf("%.2f\n", 0.7f);
编译器和CPU用来表示内存中的浮点值。大多数有理数不能用这种格式精确表示,因此编译器选择最接近的近似表示

为了避免不可预测的输出,您应该四舍五入到适当的精度

// outputs "0.70"
printf("%.2f\n", 0.7f);

浮点数或双精度浮点数存储为整数分子,2的幂作为分母。其背后的数学非常简单。它涉及移位和位测试

因此,当以10为基数声明一个常量时,编译器将其转换为23位的二进制整数和8位的指数(或52位整数和11位指数)


要将其打印出来,它将这个分数转换回10进制。

浮点数或双精度浮点数存储为整数分子,2的幂作为分母。其背后的数学非常简单。它涉及移位和位测试

因此,当以10为基数声明一个常量时,编译器将其转换为23位的二进制整数和8位的指数(或52位整数和11位指数)

要将其打印出来,它会将这个分数转换回基数10。

32位浮点(如本例所示)表示为1位符号、8位指数和尾数小数部分的23位

首先,忘记你输入的符号。然后,你输入的其余内容将作为格式的一部分存储

(1+x/8388608)*2^(y-127)(注意8.388608是2^23)。其中x是分数尾数,y是指数。信不信由你,在这种形式下,你输入的每个值只有一个表示形式。存储的值将是与你想要的数字最接近的值,如果你的值不能准确表示,这意味着你将额外获得一个.0001或其他值

所以,如果你想计算出实际存储的值,只需计算出它会变成什么

所以第二件事是(在去掉符号之后)找到2的最大幂,它的大小小于你所代表的数字

2的最大幂是32,左边是“1”,因为它是32,而不是1,这意味着右边的2^值必须是2^5(32),这意味着y是132。现在减去32,它就完成了。左边是11.2。现在我们需要把11.2表示为8338608乘以2^5的分数

所以

11.2近似等于x*32/8336608或x/262144。x的值为2938013/262144。实际分子比实际分子低0.2(2938012.8),因此262144中的误差为0.2,131072中的误差为2。在十进位中,该值为0.000015258789063。因此,如果打印足够多的数字,您将在输出中看到此误差值

当你看到输出太低时,是因为舍入方向相反,产生的值太低,更接近想要的值,因此你得到的输出太低。当值可以精确表示时(例如2的任意幂),你永远不会得到错误

这并不简单,但你可以这么做。我相信你可以把它编出来

*注意:对于非常小的量级值(大约小于2^-127),你会进入一种称为非规范值的奇怪状态。我不打算解释它们,但它们不符合模式。幸运的是,它们不会显示太多。一旦进入该范围,你的准确度就会下降。

32位浮点(如本例所示)表示为符号的1位、指数的8位和尾数小数部分的23位

首先,忘记你输入的符号。然后,你输入的其余内容将作为格式的一部分存储

(1+x/8388608)*2^(y-127)(注意,8.388608是2^23)。其中x是分数尾数和
10111.1011001100110011001100110011001100110011001100110011...
10111.1011001100110011010
23.700000762939453125
23.700001