zoukankan      html  css  js  c++  java
  • 将258.369 double值转为内存表示(科学计数法)

    前言

    庖丁解牛 - <<庄子>>

    庖丁为文惠君解牛,
    手之所触, 肩之所倚, 足之所履, 膝之所踦, 砉然向然, 奏刀騞然, 莫不中音, 合于《桑林》之舞, 乃中《经首》之会.

    文惠君曰:"嘻, 善哉! 技盍至此乎?"

    庖丁释刀对曰:"臣之所好者, 道也, 进乎技矣.
    始臣之解牛之时, 所见无非牛者.
    三年之后, 未尝见全牛也.
    方今之时, 臣以神遇而不以目视, 官知止而神欲行.
    依乎天理, 批大郤, 导大窾, 因其固然, 技经肯綮之未尝, 而况大軱乎!
    良庖岁更刀, 割也; 族庖月更刀, 折也. 今臣之刀十九年矣, 所解数千牛矣, 而刀刃若新发于硎.
    彼节者有间, 而刀刃者无厚;以无厚入有间, 恢恢乎其于游刃必有余地矣!
    是以十九年而刀刃若新发于硎.
    虽然, 每至于族, 吾见其难为, 怵然为戒, 视为止, 行为迟.
    动刀甚微, 謋然已解, 如土委地.
    提刀而立, 为之四顾, 为之踌躇满志, 善刀而藏之."

    文惠君曰:"善哉, 吾闻庖丁之言, 得养生焉."
     

    测试代码(258.369double值转科学计数法)

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /// @file PositiveFloat.cpp  
    2. /// @brief 将258.369 double值转为内存表示(科学计数法)  
    3.   
    4. #include <stdlib.h>  
    5. #include <stdio.h>  
    6.   
    7. int main(int argc, char* argv[]) {  
    8.     /// 内存中是小端摆放  
    9.     /// 4070,25E0,0000,0000  
    10.     unsigned char cBuf[8] = {0x00, 0x00, 0x00, 0x00, 0xe0, 0x25, 0x70, 0x40};  
    11.     unsigned short usBuf[4] = {0x0, 0x0, 0x25e0, 0x4070};  
    12.     double* pdbl = NULL;  
    13.   
    14.     pdbl = (double*)cBuf;  
    15.     printf("%f ", *pdbl); ///< 258.367188  
    16.   
    17.     pdbl = (double*)usBuf;  
    18.     printf("%f ", *pdbl); ///< 258.367188  
    19.       
    20.     return 0;  
    21. }  
    22.   
    23. /** 
    24.     double值在内存中是8个字节(64bits) 
    25.     S = 1bits, (258.369是正数, S = 0) 
    26.     E = 11bits 
    27.     D = 52bits 
    28.  
    29.     258.369 double值转内存值 
    30.  
    31.     整数部分转2进制表示 
    32.     258 / 2 
    33.     129         0 
    34.     129 / 2 
    35.     64          1 
    36.     64 / 2 
    37.     32          0 
    38.     32 / 2 
    39.     16          0 
    40.     16 / 2 
    41.     8           0 
    42.     8 / 2 
    43.     4           0 
    44.     4 / 2 
    45.     2           0 
    46.     2 / 2 
    47.     1           0 
    48.      
    49.     整数部分的2进制表示为(从最后一个商念到第一个油余数) 
    50.     100000010 
    51.  
    52.     小数部分转2进制表示(最多只算出8位小数的表示) 
    53.     0.369 * 2 
    54.     0.738           0 
    55.     0.738 * 2 
    56.     1.476 
    57.     0.476           1 
    58.     0.476 * 2 
    59.     0.952           0 
    60.     0.952 * 2 
    61.     1.904 
    62.     0.904           1 
    63.     0.904 * 2 
    64.     1.808 
    65.     0.808           1 
    66.     0.808 * 2 
    67.     1.616 
    68.     0.616           1 
    69.     0.616 * 2 
    70.     1.232 
    71.     0.232           1 
    72.     0.232 * 2 
    73.     0.464           0 
    74.  
    75.     小数部分的2进制表示(从第一个进位念到最后一个进位) 
    76.     .01011110 
    77.  
    78.     整数 + 小数部分为 
    79.     100000010.01011110 * 2^0 
    80.     1.0000001001011110 * 2^8 
    81.     D = 0000001001011110 (不算整数部分的1) 
    82.  
    83.     E = 1023 + 8 (2^8的指数值) 
    84.       = 1031 
    85.       = 100,0000,0111 
    86.       = 10000000111 
    87.  
    88.     E值的2进制表示 
    89.     1031 / 2 
    90.     515         1 
    91.     515 / 2 
    92.     257         1 
    93.     257 / 2 
    94.     128         1 
    95.     128 / 2 
    96.     64          0 
    97.     64 / 2 
    98.     32          0 
    99.     32 / 2 
    100.     16          0 
    101.     16 / 2 
    102.     8           0 
    103.     8 / 2 
    104.     4           0 
    105.     4 / 2 
    106.     2           0 
    107.     2 / 2 
    108.     1           0 
    109.  
    110.     从最后一个商念到第一个余数 
    111.     100,0000,0111 
    112.  
    113.     拼装SED 
    114.     0,10000000111,0000001001011110 
    115.  
    116.     补齐D部分的0(52-16 = 36, 要补36个0) 
    117.     0,10000000111,0000,0010,0101,1110,0000,0000,0000,0000,0000,0000,0000,0000,0000 
    118.  
    119.     最后的拼装结果 
    120.     0100000001110000001001011110000000000000000000000000000000000000 
    121.  
    122.     将拼装结果变成16进制 
    123.     0100,0000,0111,0000,0010,0101,1110,0000,0000,0000,0000,0000,0000,0000,0000,0000 
    124.     4    0    7    0    2    5    E    0    0    0    0    0    0    0    0    0 
    125.     407025E000000000 
    126.     4070,25E0,0000,0000 
    127.  
    128.     16进制对照表 
    129.     0000 = 0 0001 = 1 0010 = 2 0011 = 3 
    130.     0100 = 4 0101 = 5 0110 = 6 0111 = 7 
    131.     1000 = 8 1001 = 9 1010 = A 1011 = B 
    132.     1100 = C 1101 = D 1110 = E 1111 = F 
    133. */  

    测试代码(-258.369double值转科学计数法)

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /// @file PositiveFloat.cpp  
    2. /// @brief 将-258.369 double值转为内存表示(科学计数法)  
    3.   
    4. #include <stdlib.h>  
    5. #include <stdio.h>  
    6.   
    7. int main(int argc, char* argv[]) {  
    8.     /// 内存中是小端摆放  
    9.     /// C070,25E0,0000,0000  
    10.     unsigned char cBuf[8] = {0x00, 0x00, 0x00, 0x00, 0xe0, 0x25, 0x70, 0xC0};  
    11.     unsigned short usBuf[4] = {0x0, 0x0, 0x25e0, 0xC070};  
    12.     double* pdbl = NULL;  
    13.   
    14.     pdbl = (double*)cBuf;  
    15.     printf("%f ", *pdbl); ///< -258.367188  
    16.   
    17.     pdbl = (double*)usBuf;  
    18.     printf("%f ", *pdbl); ///< -258.367188  
    19.       
    20.     return 0;  
    21. }  
    22.   
    23. /** 
    24.     double值在内存中是8个字节(64bits) 
    25.     S = 1bits, (-258.369是负数, S = 1) 
    26.     E = 11bits 
    27.     D = 52bits 
    28.  
    29.     258.369 double值转内存值 
    30.  
    31.     整数部分转2进制表示 
    32.     258 / 2 
    33.     129         0 
    34.     129 / 2 
    35.     64          1 
    36.     64 / 2 
    37.     32          0 
    38.     32 / 2 
    39.     16          0 
    40.     16 / 2 
    41.     8           0 
    42.     8 / 2 
    43.     4           0 
    44.     4 / 2 
    45.     2           0 
    46.     2 / 2 
    47.     1           0 
    48.      
    49.     整数部分的2进制表示为(从最后一个商念到第一个油余数) 
    50.     100000010 
    51.  
    52.     小数部分转2进制表示(最多只算出8位小数的表示) 
    53.     0.369 * 2 
    54.     0.738           0 
    55.     0.738 * 2 
    56.     1.476 
    57.     0.476           1 
    58.     0.476 * 2 
    59.     0.952           0 
    60.     0.952 * 2 
    61.     1.904 
    62.     0.904           1 
    63.     0.904 * 2 
    64.     1.808 
    65.     0.808           1 
    66.     0.808 * 2 
    67.     1.616 
    68.     0.616           1 
    69.     0.616 * 2 
    70.     1.232 
    71.     0.232           1 
    72.     0.232 * 2 
    73.     0.464           0 
    74.  
    75.     小数部分的2进制表示(从第一个进位念到最后一个进位) 
    76.     .01011110 
    77.  
    78.     整数 + 小数部分为 
    79.     100000010.01011110 * 2^0 
    80.     1.0000001001011110 * 2^8 
    81.     D = 0000001001011110 (不算整数部分的1) 
    82.  
    83.     E = 1023 + 8 (2^8的指数值) 
    84.       = 1031 
    85.       = 100,0000,0111 
    86.       = 10000000111 
    87.  
    88.     E值的2进制表示 
    89.     1031 / 2 
    90.     515         1 
    91.     515 / 2 
    92.     257         1 
    93.     257 / 2 
    94.     128         1 
    95.     128 / 2 
    96.     64          0 
    97.     64 / 2 
    98.     32          0 
    99.     32 / 2 
    100.     16          0 
    101.     16 / 2 
    102.     8           0 
    103.     8 / 2 
    104.     4           0 
    105.     4 / 2 
    106.     2           0 
    107.     2 / 2 
    108.     1           0 
    109.  
    110.     从最后一个商念到第一个余数 
    111.     100,0000,0111 
    112.  
    113.     拼装SED 
    114.     1,10000000111,0000001001011110 
    115.  
    116.     补齐D部分的0(52-16 = 36, 要补36个0) 
    117.     1,10000000111,0000,0010,0101,1110,0000,0000,0000,0000,0000,0000,0000,0000,0000 
    118.  
    119.     最后的拼装结果 
    120.     1100000001110000001001011110000000000000000000000000000000000000 
    121.  
    122.     将拼装结果变成16进制 
    123.     1100,0000,0111,0000,0010,0101,1110,0000,0000,0000,0000,0000,0000,0000,0000,0000 
    124.     C    0    7    0    2    5    E    0    0    0    0    0    0    0    0    0 
    125.     C07025E000000000 
    126.     C070,25E0,0000,0000 
    127.  
    128.     16进制对照表 
    129.     0000 = 0 0001 = 1 0010 = 2 0011 = 3 
    130.     0100 = 4 0101 = 5 0110 = 6 0111 = 7 
    131.     1000 = 8 1001 = 9 1010 = A 1011 = B 
    132.     1100 = C 1101 = D 1110 = E 1111 = F 
    133. */  

    http://blog.csdn.net/lostspeed/article/details/50541910

  • 相关阅读:
    只要你拥有爱心,你就会拥有快乐。
    解决升级 Office 2010 之后 Outlook 提示“无法打开 Microsoft Outlook”
    《老人与海》
    UML模型的组成
    2009年11月11日
    IBatis存取图片在Oracle Blob大字段中Asp.Net
    “北京今年入冬的第一场雪”,纪念博客园写日志一年了
    UML建模实践概述
    UML 类图
    UML 用例图
  • 原文地址:https://www.cnblogs.com/findumars/p/5187269.html
Copyright © 2011-2022 走看看