提问人:foo 提问时间:2/24/2011 最后编辑:Peter Mortensenfoo 更新时间:3/13/2021 访问量:517612
“浮点”与“双精度”精度
'float' vs. 'double' precision
问:
代码
float x = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);
会给你输出
x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116
其中输出的第三行是垃圾,第四行是垃圾。双打总是有 16 个有效数字,而浮动总是有 7 个有效数字吗?为什么双打没有 14 个有效数字?741012573242
116
答:
它通常基于以 2 为基数的指数和有效数,而不是以 10 为基数。然而,据我所知,在 C99 标准中,浮点数和双精度没有指定的精度(除了 1 和 / 是可区分的 [ 和重复] 这一事实)。但是,有效数字的数量留给实现者(以及他们在内部使用哪个基数,因此换句话说,实现可以决定根据基数 3 中的 18 位精度来制作它)。[1]1 + 1E-5
1 + 1E-7
float
double
如果您需要知道这些值,常量和 (和 / ) 在 float.h 中定义。FLT_RADIX
FLT_MANT_DIG
DBL_MANT_DIG
LDBL_MANT_DIG
之所以称它为 a,是因为用于存储它的字节数是浮点数的两倍(但这包括指数和有效)。IEEE 754 标准(大多数编译器使用)为有效数分配的位数比指数数的位数相对较多(23 到 9 为 23 到 9,而指数为 52 到 12 ),这就是为什么精度增加了一倍以上的原因。double
float
double
1:第 5.2.4.2.2 节 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )
评论
1E-9
double
1E-7
C 语言中的浮点数使用 IEEE 754 编码。
这种类型的编码使用符号、有效和指数。
由于这种编码,许多数字将进行小的更改以允许存储它们。
此外,有效位数可能会略有变化,因为它是二进制表示,而不是十进制表示。
单精度(浮点数)为您提供 23 位有效位、8 位指数位和 1 位符号位。
双精度 (double) 为您提供 52 位有效位、11 位指数位和 1 位符号位。
评论
0.5
0.046875
0.376739501953125
double
float
由于 IEEE 754 的工作方式,以及二进制不能很好地转换为十进制,因此它并不完全是双精度。如果您有兴趣,请查看标准。
双打总是有 16 个重要吗 数字,而浮点数总是有 7 重要数字?
不。双精度值总是有 53 个有效位,浮点数总是有 24 个有效位(非正态、无穷大和 NaN 值除外,但这些是另一个问题的主题)。这些是二进制格式,您只能清楚地谈论它们以二进制数字(位)表示的精度。
这类似于二进制整数中可以存储多少位的问题:一个无符号的 32 位整数可以存储最多 32 位的整数,这不能精确映射到任何数量的十进制数字:最多 9 个十进制数字的所有整数都可以存储,但也可以存储很多 10 位数字。
为什么不加倍 有 14 个有效数字?
双精度编码使用 64 位(1 位用于符号,11 位用于指数,52 个显式有效位和 1 个隐式位),这是用于表示浮点数(32 位)的位数的两倍。
评论