c语言中float精度问题

3.1415926(10进制) ==

11.00100100001111110110100110100010010110110000100101(2进制) ==

1.100100100001111110110100110100010010110110000100101 * 2

用gdb调试打印float变量里的内容为0x40490fda(16进制),即01000000010010010000111111011010(2进制)

0(最高位0,表示正数)10000000(IEEE规定, 此处算出的次方须减去127才是真的指数,,在此处的指数位为1) 10010010000111111011010 (此23位表示小数部分,

因为在计算机中采用了隐藏位技术:最高位的1不写入内存,所以小数部分实际上是1.10010010000111111011010)

1.10010010000111111011010(2进制)==1.5707962512969970703125(10进制)

1.5707962512969970703125 * 2 == 3.141592502593994140625

float f = 3.1415926;

printf("%f\n", f);

printf函数默认精确到小数点6位,最后一位进行四舍五入,所以得到的结果是3.141593

以下为验证:

printf("%.7f\n", f);结果应该是3.1415925;

printf("%.8f\n", f);结果应该是3.14159250

printf("%.9f\n", f);结果应该是3.141592503

因为float的尾数为为23位,所以小数位保留23位,即

3.1415926(10进制) == 1.1001001000011111101100(2进制)

因为在计算机中采用了隐藏位技术:最高位的1不写入内存,所以1.1001001000011111101100(2进制)应该表示为0.1001001000011111101100

又因为指数可以为负,为了便于计算,所以IEEE规定, 此处算出的次方须减去127才是真的指数,,在此处的指数位为1(即2的1次幂)

时间: 2024-10-27 02:21:43

c语言中float精度问题的相关文章

c语言中float、double、long double在内存中存储方式

存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m  和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指数部分:占用8=bit空间来表示,表示数值范围:0-255:后面介绍 用于存储科学计数法中的指数部分,并且采用移位存储方式: 具体分析: 浮点数据就是按下表的格式存储在4个字节中: Address+0 Address+1 Address+2 Address+3 Contents SEEE EEEE

C语言中float如何存储?

float 内存如何存储的 类型 存储位数 总位数 偏移值 (offset) 数符(S) 阶码(E) 尾数(M) 短实数(float) 1 8 23 32 127 长实数(double) 1 11 52 64 1023 N (10) = 123.456, 换算成二进制表示: N (2) = 1111011. 01110100101111001 = 1. 11101101110100101111001(...) * 2^6    那么E – 127 = 6;  E = 127 + 6 = 133(

Java语言中:float、double数据类型在内存中是如何存储的

引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/article/details/70145416 java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储

C语言中的nan和inf使用

本文总结nan和inf在C语言当中的含义.产生和判定方法. C语言当中的nan 表示not a number,等同于 #IND:indeterminate (windows) 产生: 对浮点数进行了未定义的操作: 对负数开方,对负数求对数,0.0/0.0,0.0*inf.inf/inf.inf-inf这些操作都会得到nan.(0/0会产生操作异常:0.0/0.0不会产生操作异常,而是会得到nan): 在GNU中,使用宏:float NAN对浮点数赋值: 判定: 库函数方法:(推荐) <见后>

C语言中void*详解及应用

void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void为"无类型",相应的void *为"无类型指针".void似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释. 本文地址:http://www.cnblogs.com/archimedes/p/c-void-point.html,转载请注明源地址. void的作用: 1.对函数

C语言中,结构体成员变量的点和箭头

C语言中,调用成员变量用点还是用箭头,取决于当前的ID是指针还是结构体本身. 如: typedef struct { float height; float weight; } Person; int main(int argc, char *argv[]) { Person jiushen; Person *lengleng = (Person *)malloc(sizeof(Person)); //注意这里结构体指针的声明,要分配空间 jiushen.weight = 60; jiushen

C语言中sizeof与strlen区别

C语言中sizeof 与strlen 区别 一.本质区别 sizeof 和strlen 有本质上的区别.sizeof 是C 语言的一种单目运算符,如++.--等,并不是函数,sizeof 的优先级为2 级,比/.% 等3 级运算符优先级高,sizeof 以字节的形式给出操作数的存储空间的大小.而 strlen 是一个函数,是由 C 语言 的标准库提供的.strlen 计算的  是字符串的长度. 二.使用区别 1.sizeof sizeof 的操作数可以是数据类型.函数.变量,表达式使用方式为:

转]解析C语言中的sizeof

解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. 二.sizeof的使用方法 1.用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住.如sizeof(int). 2.用于变量 sizeof使用形式:sizeof(var_name)或size

C语言中,double、long、unsigned、int、char类型数据所占字节数

C语言中,double.long.unsigned.int.char类型数据所占字节数和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位. unsigned 是无符号的意思. 16位编