首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“‘float”与“double”精度

“‘float”与“double”精度
EN

Stack Overflow用户
提问于 2011-02-24 07:21:09
回答 3查看 498.4K关注 0票数 153

代码

代码语言:javascript
复制
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);

将为您提供输出

代码语言:javascript
复制
x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

其中,输出741012573242的第三行是垃圾,第四行的116是垃圾。双精度数总是有16个有效数字,而浮点数总是有7个有效数字?为什么双倍没有14位有效数字?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-24 07:24:58

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

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

由于这种编码,许多数字将有很小的变化,以允许它们被存储。

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

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

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

票数 147
EN

Stack Overflow用户

发布于 2011-02-24 07:24:55

它通常基于以2为基数的指数和有效数的有效数字,而不是以10为基数。然而,根据我在C99标准中所能看出的,浮点数和双精度数没有指定的精度(除了1和1 + 1E-5 / 1 + 1E-7分别可区分floatdouble这一事实之外)。但是,有效数字的数量由实现者决定(以及他们内部使用的基数,因此换句话说,实现可以根据基数3中的18位精度来决定)。1

如果需要知道这些值,可以在FLT_RADIXFLT_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 )

票数 10
EN

Stack Overflow用户

发布于 2011-02-24 07:25:35

浮点型的精度为23位,双精度型的精度为52位。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5098558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档