c语言中浮点数精度陷阱

浮点数在计算机中采用数符+阶码+尾数表示。

主要有以下几个需要注意的点:

1.float型 有效数字为6-7位,

  double型 有效数字为15-16位。

2.浮点数间比较大小不能通过==运算符比较。因为在机器中小数采用近似值表示。

  需要通过减法去比较。如

float f1 = 4.56;
if(abs(f1-4.56)<1e-6){
    printf("f1 is equal to 4.56");
}

3.在内存中存放方式(大端,小端)

https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin

阶码实际值 为 数值-127, 以2为底。

4.数据转换:

在整数除法中,由于整数除法会丢失小数。

int a = 5;
int b = 2;
float f = a / b;
printf("%f\n",f);

输出为2.0 。这里是因为前面 a/b 已经造成了数据丢失,才赋值给float。所以没有输出2.5 。

需要对a或b进行强制类型转换成float或者double才可以。

float f = (float)a / b;
printf("%f", f);

此时输出为2.5 。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 双精度浮点数C语言的一种数据类型,用于存储小数。它的精度比单精度浮点数更高,可以存储更大范围的数值。在C语言,双精度浮点数的关键字是double,它占用8个字节的内存空间,可以表示的数值范围为±2.23e-308~±1.79e+308,精度为15~16位小数。使用双精度浮点数时,需要在数值后面加上字母d或D,例如:3.1415926D。 ### 回答2: C语言精度浮点数是一种数据类型,通常用于表示具有大范围和高精度需求的浮点数。它在内存占据8个字节(64位),其一部分用于存储数值的符号位,指数位和尾数位。 双精度浮点数可以表示非常大或非常小的数值,其取值范围一般为±1.7E-308到±1.7E+308,精度可以达到15位有效数字。这使得双精度浮点数在科学计算、工程应用等领域非常有用。 双精度浮点数的内部表示遵循IEEE 754标准,其最高位用于表示数值的符号,0表示正数,1表示负数。接下来的11位用于存储指数,用于表示数值的大小,余下的52位用于存储尾数,表示数值的精度。 由于双精度浮点数的存储方式是基于二进制的,因此在进行数值计算时可能会出现舍入误差。这是因为某些十进制数无法准确表示为有限位数的二进制数。因此,在使用双精度浮点数进行计算时,需要注意这种舍入误差可能对计算结果的影响。 为了提高计算的性能,C语言提供了一系列的浮点数运算函数,如加法、减法、乘法、除法等。双精度浮点数变量可以通过赋值操作符或预定义的数值常量进行初始化。在程序使用双精度浮点数时,可以使用%lf格式化符进行输入输出。 总之,C语言的双精度浮点数是一种用于表示大范围和高精度浮点数的数据类型。它的内部表示符合IEEE 754标准,并提供了一系列的数值计算函数来处理双精度浮点数。在进行计算时需要注意舍入误差的可能性。 ### 回答3: C语言的双精度浮点数是一种数据类型,用于表示带有小数部分的数值。其关键字为double,占用8个字节(64位)的内存空间。 双精度浮点数的范围非常广泛,可以表示非常大或非常小的数值,通常可达到±10的308次方。这是由于双精度浮点数使用了指数表示法,在内存以一定的形式存储数值。 双精度浮点数的表示形式由三个主要部分组成:符号、指数和尾数。其,符号位用于表示正或负数,占用1位。指数位用于存储数值的指数部分,占用11位。尾数用于存储数值的小数部分,占用52位。 C语言浮点数运算使用IEEE 754标准,该标准规定了浮点数的二进制表示和运算方式。浮点数的算术运算包括加、减、乘、除等操作,但其精度有限,可能会导致舍入误差。因此,在比较两个浮点数是否相等时,应该考虑设置一个误差范围。 为了提高程序的效率和可靠性,需要注意浮点数精度问题和浮点数计算的舍入误差。同时,可以使用C语言的数学函数库来执行更复杂的浮点数计算,如三角函数、指数函数等。 总之,C语言的双精度浮点数提供了一种有效的方式来处理带有小数部分的数值,其范围广泛且精度可控,但需要注意数字的精度问题和舍入误差。在实际应用,要根据需要选择合适的数据类型来处理浮点数的运算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值