代码
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
其中,输出741012573242
的第三行是垃圾,第四行的116
是垃圾。双精度数总是有16个有效数字,而浮点数总是有7个有效数字?为什么双倍没有14位有效数字?
发布于 2011-02-24 07:24:58
C中的浮点数使用IEEE 754编码。
这种类型的编码使用符号、有效数和指数。
由于这种编码,许多数字将有很小的变化,以允许它们被存储。
此外,有效位数可以稍有变化,因为它是二进制表示,而不是十进制表示。
单精度(浮点数)提供23位有效数、8位指数和1个符号位。
双精度( Double )提供52位有效数、11位指数和1个符号位。
发布于 2011-02-24 07:24:55
它通常基于以2为基数的指数和有效数的有效数字,而不是以10为基数。然而,根据我在C99标准中所能看出的,浮点数和双精度数没有指定的精度(除了1和1 + 1E-5
/ 1 + 1E-7
分别可区分float
和double
这一事实之外)。但是,有效数字的数量由实现者决定(以及他们内部使用的基数,因此换句话说,实现可以根据基数3中的18位精度来决定)。1
如果需要知道这些值,可以在FLT_RADIX
和FLT_MANT_DIG
(以及DBL_MANT_DIG
/ LDBL_MANT_DIG
)中定义常量。
它被称为double
的原因是用于存储它的字节数是浮点数的两倍(但这包括指数和有效数)。IEEE754标准(大多数编译器使用)为有效数分配的位数比指数多( float
为23到9,double
为52到12 ),这就是为什么精度提高了一倍多的原因。
1:第5.2.4.2.2节( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )
发布于 2011-02-24 07:25:35
浮点型的精度为23位,双精度型的精度为52位。
https://stackoverflow.com/questions/5098558
复制相似问题