“浮点”与“双精度”精度

'float' vs. 'double' precision

提问人:foo 提问时间:2/24/2011 最后编辑:Peter Mortensenfoo 更新时间:3/13/2021 访问量:517612

问:

代码

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 个有效数字?741012573242116

c 浮点

评论

0赞 Chris Nash 2/24/2011
浮点数的精度为 23 位,双精度数的精度为 52 位。
0赞 chux - Reinstate Monica 2/19/2015
细节: binary64 有一个 53 位有效 (52 显式存储) binary32 有 24 位 (23 显式存储).

答:

11赞 user470379 2/24/2011 #1

它通常基于以 2 为基数的指数和有效数,而不是以 10 为基数。然而,据我所知,在 C99 标准中,浮点数和双精度没有指定的精度(除了 1 和 / 是可区分的 [ 和重复] 这一事实)。但是,有效数字的数量留给实现者(以及他们在内部使用哪个基数,因此换句话说,实现可以决定根据基数 3 中的 18 位精度来制作它)。[1]1 + 1E-51 + 1E-7floatdouble

如果您需要知道这些值,常量和 (和 / ) 在 float.h 中定义。FLT_RADIXFLT_MANT_DIGDBL_MANT_DIGLDBL_MANT_DIG

之所以称它为 a,是因为用于存储它的字节数是浮点数的两倍(但这包括指数和有效)。IEEE 754 标准(大多数编译器使用)为有效数分配的位数比指数数的位数相对较多(23 到 9 为 23 到 9,而指数为 52 到 12 ),这就是为什么精度增加了一倍以上的原因。doublefloatdouble

1:第 5.2.4.2.2 节 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )

评论

0赞 Rufflewind 10/20/2016
错字?C89 最多需要 的 epsilon ,而不是 。1E-9double1E-7
160赞 Alan Geleynse 2/24/2011 #2

C 语言中的浮点数使用 IEEE 754 编码。

这种类型的编码使用符号、有效和指数。

由于这种编码,许多数字将进行小的更改以允许存储它们。

此外,有效位数可能会略有变化,因为它是二进制表示,而不是十进制表示。

单精度(浮点数)为您提供 23 位有效位、8 位指数位和 1 位符号位。

双精度 (double) 为您提供 52 位有效位、11 位指数位和 1 位符号位。

评论

5赞 Alan Geleynse 2/24/2011
C99 确实如此,以前它取决于编译器。
21赞 R.. GitHub STOP HELPING ICE 2/24/2011
-1 这种说法是公然错误的:“由于这种编码,你永远无法保证你的值不会发生变化。
17赞 R.. GitHub STOP HELPING ICE 2/24/2011
@Alan:C99不需要IEEE浮点;它只是推荐它。
13赞 R.. GitHub STOP HELPING ICE 2/24/2011
@Alan:在 IEEE 754 下,很容易保证值 、 或相对于它们的十进制表示形式没有变化。(这些都是正数有理数,分子拟合在尾数中,分母的底数 2 对数拟合在指数中。0.50.0468750.376739501953125
6赞 ikegami 1/8/2018
s 的 53 位给出了大约 16 位的精度。s 的 24 位给出了大约 7 位的精度。doublefloat
3赞 user541686 2/24/2011 #3

由于 IEEE 754 的工作方式,以及二进制不能很好地转换为十进制,因此它并不完全是精度。如果您有兴趣,请查看标准。

45赞 Stephen Canon 2/24/2011 #4

双打总是有 16 个重要吗 数字,而浮点数总是有 7 重要数字?

不。双精度值总是有 53 个有效位,浮点数总是有 24 个有效(非正态、无穷大和 NaN 值除外,但这些是另一个问题的主题)。这些是二进制格式,您只能清楚地谈论它们以二进制数字(位)表示的精度。

这类似于二进制整数中可以存储多少位的问题:一个无符号的 32 位整数可以存储最多 32 位的整数,这不能精确映射到任何数量的十进制数字:最多 9 个十进制数字的所有整数都可以存储,但也可以存储很多 10 位数字。

为什么不加倍 有 14 个有效数字?

双精度编码使用 64 位(1 位用于符号,11 位用于指数,52 个显式有效位和 1 个隐式位),这是用于表示浮点数(32 位)的位数的两倍