请注意+星公共帐户,不要错过令人兴奋的内容。
作者|叶峰安排| strongHuang为什么我们的代码会强制浮点数和整数进行转换,或者打印出精度损失或出错?要了解此问题,您需要了解整数和浮点数的存储规则。
嵌入式第1列浮点数存储规则根据国际标准IEEE(电气与电子工程学会),任何浮点数NUM的二进制数都可以写为:NUM =(-1)^ S * M * 2 ^ E; (S表示符号,E表示阶乘,M表示有效数字)①当S为0时,表示正数;当S为1时,它表示一个负数; ②M代表有效数字,1③2^ E代表指数,例如十进制为3.0,如果二进制为0011.0,则可以表示为(-1)^ 0 * 1.1 * 2 ^1。
例如,十进制为-3.0,二进制系统为-0011.0,可以写为(-1)^ 1 * 1.1 * 2 ^1。
符号位(S)具有8个指数位(E)和23个有效数字(M) 。
双精度类型具有符号位(S),11个指数(E)和52个有效数字(M)以浮点类型为例:IEEE对(有效数字)M和(指数)E(采用浮点数)有特殊规定例如):1.因为M的值必须为1,所以可以节省空间。
以浮点类型为例,例如,您可以保存23位十进制信息,并添加四舍五入以使用23位数字表示24个有效信息。
2.对于E(指数),E是一个无符号整数,因此E的取值范围是(0〜255),但是指数在计数时可以为负,因此规定当E以其原始值存储时,将中间数字(127)到顶部,并且在使用中间数字(127)时将其减去,因此E的真实值范围变为(-127〜128)。
E有三种情况:①E不是全为0,也不是全为1:这时,使用常规计算规则。
E的真实值是E的文字值减去127(中间值),并且必须加上M的值。
第一个省略的1。
②E均为0。
此时,指数E等于1-127 ,这才是真正的价值。
M不与四舍五入后的1相加,而是减少为十进制的0.xxxxxxxx。
为了表示0,还有一些非常小的整数。
因此,将浮点数与0进行比较时,请注意。
③E全为1当M全为0时,表示±无穷大(取决于符号位);当M不全为1时,表示该数字不是数字(NaN)。
嵌入式框2的测试代码如下:void test(void){float m = 134.375; char * a =(char *)& m; printf(“ 0x%p:%d ",a,* a); printf(“ 0x%p:%d ",a + 1,*(a + 1)); printf(“ 0x%p:%d ",a + 2,*(a + 2)); printf(“ 0x%p:%d “,a + 3,*(a + 3));}代码输出结果:具体计算过程如下:嵌入式框3精度损失我们可以将小数部分乘以2,并将整数部分作为1中的一位。
binary,剩余的小数继续乘以2,直到没有剩余的小数为止。
例如,0.2可以转换为:0.2 x 2 = 0.4 0 0.4 x 2 = 0.8 0 0.8 x 2 = 1.6 1 0.6 x 2 = 1.2 1 0.2 x 2 = 0.4 0 0.4 x 2 = 0.8 0 0.8 x 2 = 1.6 1…即:.0011001…这是一个无限循环的二进制数,这就是为什么将十进制数转换为二进制数时会损失精度的原因。
您共享的单精度,双精度,多精度和混合精度计算之间有什么区别?也许您不太了解。
今天我读了浮点数的存储规则,你明白吗?嵌入式专栏4整数的存储规则了解了浮点数的存储规则之后,理解整数非常简单。
整数以补码形式存储在内存中,并且有正整数和负整数。
当需要存储带符号的数字时,第一位用于指示正数(0)和负数(1)。
正数的一个补码和补码本身仍然是,下面主要讨论负数的一个补码和补码。
反转码是除去最高符号位后的原始码的反转,其余位逐位反转,补码是除1之外的反转码。
测试码:void test(void){int8_t n = -123; uint8_t * p =(uint8_t *)& n; printf(“%d ",n); printf(“%d " * p);}输出结果:计算过程如下:资料来源:https://blog.csdn.net/u014470361/article/details/79820892免责声明:本文源自网络,并且版权属于原作者。
如果涉及版权问题,请与我联系以删除。
------------结束------------推荐阅读:特色摘要|列|目录|搜索特征