258.369f的科学记数法手工计算和验证

来源:互联网 发布:网络家庭摄像头直播 编辑:程序博客网 时间:2024/04/28 06:03

前言

卖油翁 - 欧阳修

陈康肃公尧咨善射,当世无双 ,公亦以此自矜。
尝射于家圃,有卖油翁释担而立,睨之,久而不去。
见其发矢十中八九,但微颔之。
康肃问曰:“汝亦知射乎?吾射不亦精乎?”
翁曰:“无他, 但手熟尔。”
康肃忿然曰:“尔安敢轻吾射?”
翁曰:“以我酌油知之。”
乃取一葫芦置于地,以钱覆其口,徐以杓酌油沥之,自钱孔入,而钱不湿。
因曰:“我亦无他, 惟手熟尔。”
康肃笑而遣之。

隔了一段时间不用, float值转内存表示又忘了细节, 杯具...

试验代码(258.369)

/// @file \exam_float_ieee\byIde\main.cpp/**浮点数(float, double)科学计数法的手工计算浮点数都要手工计算, 算完后, 用计算机内存赋值法, 看计算的是否正确.将浮点数表示的科学计数法值, 转成浮点数.*/#include "stdlib.h"#include "stdio.h"int main(int argc, char* argv[]) {    // 258.369f ieee = 43812F00    // 43,81,2F,00    // 内存中是小端摆放    unsigned char cBuf[4] = {0x00, 0x2F, 0x81, 0x43};    float* pf = (float*)cBuf;    printf("%f\n", *pf);    /** run result    258.367188    */    return 0;}/**    浮点数(float, double)科学计数法的手工计算    1. 浮点数(float)科学计数法的手工计算    float fObj = 258.369f    科学计数法结果, 一共4字节, 32bits    S = 1 bits    E = 8 bits    D = 23 bits    258.369f 是正数 S = 0    // 算整数部分科学计数法值    258 / 2    129         0    129 / 2    64          1    64 / 2    32          0    32 / 2    16          0    16 / 2    8           0    8 / 2    4           0    4 / 2    2           0    2 / 2    1           0    从最后一个商念到第一个余数为1000,00010    整数部分为   100000010    // 算小数部分科学计数法值, 最多算8位的科学计数小数部分    0.369    0.369 * 2    0.738       0    0.738 * 2    1.476    0.476       1    0.476 * 2    0.952       0    0.952 * 2    1.904    0.904       1    0.904 * 2    1.808    0.808       1    0.808 * 2    1.616    0.616       1    0.616 * 2    1.232    0.232       1    0.232 * 2    0.464       0    从第一个进位念到最后一个进位 0101,1110    01011110    258.369f        = 100000010.01011110B        = 1.0000001001011110B * 2^8    S = 0 (整数)    E = 127 + 8 ///< 取2^8的指数值8      = 135    135 / 2    67          1    67 / 2    33          1    33 / 2    16          1    16 / 2    8           0    8 / 2    4           0    4 / 2    2           0    2 / 2    1           0    /// 指数部分    /// 从最后一个商读到第一个余数 : 1000,0111    /// 10000111    D = 0000001001011110 (1.0000001001011110B * 2^8 的小数部分)      = 0000,0010,0101,1110,0000,000 (补足7个0, 凑成23位)      = 00000010010111100000000    SED = 0,10000111,00000010010111100000000        = 01000011100000010010111100000000        = 0100,0011,1000,0001,0010,1111,0000,0000        = 4    3    8    1    2    F    0    0        = 43812F00  16进制数比对表  0000 = 0    0001 = 1    0010 = 2    0011 = 3  0100 = 4    0101 = 5    0110 = 6    0111 = 7  1000 = 8    1001 = 9    1010 = A    1011 = B  1100 = C    1101 = D    1110 = E    1111 = F  */

试验代码(-258.369)

/// @file \exam_float_ieee\byIde\main.cpp/**浮点数(float, double)科学计数法的手工计算浮点数都要手工计算, 算完后, 用计算机内存赋值法, 看计算的是否正确.将浮点数表示的科学计数法值, 转成浮点数.*/#include "stdlib.h"#include "stdio.h"int main(int argc, char* argv[]) {    // -258.369f ieee = C3812F00    // C3,81,2F,00    // 内存中是小端摆放    unsigned char cBuf[4] = {0x00, 0x2F, 0x81, 0xC3};    float* pf = (float*)cBuf;    printf("%f\n", *pf);    /** run result    -258.367188    */    return 0;}/**    浮点数(float, double)科学计数法的手工计算    1. 浮点数(float)科学计数法的手工计算    float fObj = -258.369f    科学计数法结果, 一共4字节, 32bits    S = 1 bits    E = 8 bits    D = 23 bits    -258.369f 是负数 S = 1    // 算整数部分科学计数法值    258 / 2    129         0    129 / 2    64          1    64 / 2    32          0    32 / 2    16          0    16 / 2    8           0    8 / 2    4           0    4 / 2    2           0    2 / 2    1           0    从最后一个商念到第一个余数为1000,00010    整数部分为   100000010    // 算小数部分科学计数法值, 最多算8位的科学计数小数部分    0.369    0.369 * 2    0.738       0    0.738 * 2    1.476    0.476       1    0.476 * 2    0.952       0    0.952 * 2    1.904    0.904       1    0.904 * 2    1.808    0.808       1    0.808 * 2    1.616    0.616       1    0.616 * 2    1.232    0.232       1    0.232 * 2    0.464       0    从第一个进位念到最后一个进位 0101,1110    01011110    258.369f        = 100000010.01011110B        = 1.0000001001011110B * 2^8    S = 0 (整数)    E = 127 + 8 ///< 取2^8的指数值8      = 135    135 / 2    67          1    67 / 2    33          1    33 / 2    16          1    16 / 2    8           0    8 / 2    4           0    4 / 2    2           0    2 / 2    1           0    /// 指数部分    /// 从最后一个商读到第一个余数 : 1000,0111    /// 10000111    D = 0000001001011110 (1.0000001001011110B * 2^8 的小数部分)      = 0000,0010,0101,1110,0000,000 (补足7个0, 凑成23位)      = 00000010010111100000000    SED = 1,10000111,00000010010111100000000        = 11000011100000010010111100000000        = 1100,0011,1000,0001,0010,1111,0000,0000        = C    3    8    1    2    F    0    0        = C3812F00  16进制数比对表  0000 = 0    0001 = 1    0010 = 2    0011 = 3  0100 = 4    0101 = 5    0110 = 6    0111 = 7  1000 = 8    1001 = 9    1010 = A    1011 = B  1100 = C    1101 = D    1110 = E    1111 = F  */





0 0