将258.369 double值转为内存表示(科学计数法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将258.369 double值转为内存表示(科学计数法)相关的知识,希望对你有一定的参考价值。

前言

庖丁解牛 - <<庄子>>

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

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

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

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

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

[cpp] view plain copy
 
 技术分享技术分享
  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\n", *pdbl); ///< 258.367188  
  16.   
  17.     pdbl = (double*)usBuf;  
  18.     printf("%f\n", *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
 
 技术分享技术分享
  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\n", *pdbl); ///< -258.367188  
  16.   
  17.     pdbl = (double*)usBuf;  
  18.     printf("%f\n", *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

以上是关于将258.369 double值转为内存表示(科学计数法)的主要内容,如果未能解决你的问题,请参考以下文章

如何避免mysql的double自动转为科学计数法表示

Double 判断小数位数

JAVA中Double,如何才能不显示成科学计数法

如何使java中double类型不以科学计数法表示

如何使java中double类型不以科学计数法表示

如何使java中double类型不以科学计数法表示