“浮动”与“双”精度

“浮动”与“双”精度

密码


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个重要数字呢?


泛舟湖上清波郎朗
浏览 434回答 3
3回答

一只斗牛犬

C中的浮点数IEEE 754编码。这种类型的编码使用符号、意义和指数。由于这种编码,许多数字将有小的变化,以允许它们被存储。此外,有效数字的数目也可能略有变化,因为它是二进制表示,而不是十进制表示。单精度(浮点)给你23位的意义,8位的指数,和1符号位。双精度(双)给出了52位的显着性,11位的指数,1位的符号位。

冉冉说

双打总是有16个重要数字,而浮标总是有7个重要数字吗?没有。双打总是有53个重要的位元浮标总是有24个显著的位元(除了非正态值、无穷大值和NaN值之外,这些都是另一个问题的主题)。这些是二进制格式,您只能用二进制数字(位)清楚地说明它们表示的精度。这类似于一个二进制整数可以存储多少位数的问题:一个无符号的32位整数可以存储多达32位的整数,这并不能精确地映射到任何数量的十进制数:所有9位以下的整数都可以存储,但也可以存储很多10位数的数字。为什么不双倍有14个重要数字呢?双比特的编码使用64位(符号为1位,指数为11位,显式有效位为52位,隐式位为1位),即双倍用来表示浮点数(32位)的位数。
打开App,查看更多内容
随时随地看视频慕课网APP