c - 为什么输出不同?

标签 c floating-point

使用下面给出的 C 代码(在 Visual Studio 中编写):

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    float i = 2.0/3.0;
    printf("%5.6f", i);
    return 0;
}

产生输出: 0.666667

但是,当 %5.6f 更改为 %5.20f 时,输出更改为: 0.66666668653488159000

我的问题是为什么类似小数的输出会发生细微变化?

最佳答案

当您使用 32 位 float 时,计算机将 2./3. 的结果表示为 11,184,811/16,777,216,正好是 0.666666686534881591796875。在您使用的 float 中,数字始终表示为某个整数乘以 2 的某个幂(可能是 2 的负幂)。由于整数的大小限制(当您使用 float 时,整数必须适合 24 位,不包括符号),最接近 2/3 的可表示值是 11,184,811/16,777,216。

带有 '%5.6f` 的 printf 显示“0.666667”的原因是因为“%5.6f”只要求六位数字,所以数字在第六位四舍五入。

带有 %5.20fprintf 显示“0.66666668653488159000”的原因是您的 printf 实现在 17 位数字后“放弃”,计算这在某种意义上已经足够接近了。 printf 的某些实现(有人可能会争论说更好)会在请求的格式允许的情况下尽可能接近地打印表示的值。在这种情况下,它们会显示“0.66666668653488159180”,如果您要求更多数字,它们会显示确切的值“0.666666686534881591796875”。

( float 格式通常表示为符号、1[含]和2[不含]之间的小数和指数,而不是符号、整数和指数。在数学上,它们是与指数调整相同:每个可以用符号、24 位无符号整数和指数表示的数字等于某个带符号、1 到 2 之间的小数和调整指数的数字。使用整数版本倾向于使证明更容易,有时有助于解释。)

关于c - 为什么输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151250/

相关文章:

c++ - float 和 double 变量中的数字

c - 只是打电话投诉

c++ - 当使用__block时,clang BlocksRuntime在可执行文件中嵌入 'obsolete compiler'警告

Java- 非零 Int 除以 10 在 Float 中等于 0.0?

C - While 循环内的 If 语句。连续扫描()

php - 在 PHP 中将混合分数字符串转换为 float

python - 是否可以使用 NumPy 或 Python 中的其他包获取 double 二进制浮点的保留特殊数字

c - 获取进程返回-1073741819 (0xC0000005)错误而不是答案

c - 向结构数组添加新条目会覆盖所有最后的条目

c - Gcc 默认版本崩溃