double转16进制科学记数

double 5.6716进制浮点数

 

测试程序

/// @file topic1.c

/// @brief test on vs6 cl and link

/// 5.67 double值转16进制科学记数法

 

#include <stdio.h>

#include <stdlib.h>

 

void clear_input_buffer();

 

int main(int argc, char* argv[])

{

    int iIndex = 0;

    double fIn = 5.67;

    /// 想验证下,进程中的变量地址对应的16进制浮点数的具体值

    /// 然后在手工运算这样就知道自己算得对不对

printf("&fIn = %08x, fIn = %f\r\n", &fIn, fIn);

    

    for (iIndex = 7; iIndex >= 0; iIndex--)

    {

        printf("%.2x ", (unsigned char)(*((unsigned char*)&fIn + iIndex)));

    }

    

    printf("\n");

    

    /** run result

    &fIn = 0012ff78, fIn = 5.670000

    40 16 ae 14 7a e1 47 ae

    */

 

    /// 40 16 ac 00 00 00 00 00 这是我算出来的 5.76 double, 精度是小数点后8

    /// 看看和电脑算的差多少.

    printf("please use winhex to modify fIn value, then press any key to continue\n");

    system("pause");

    printf("&fIn = %08x, fIn = %f\r\n", &fIn, fIn);

    

printf("END, press any key to quit\n");

getchar();

return 0;

}

 

void clear_input_buffer()

{

char ch = '\0';

/// scanf 的回车 0x0a, 留在了buffer里面getchar()还能读的到

/// clear input buffer

do

{

ch = getchar();

} while ((ch != EOF) && (ch != '\n'));

}

 

手工演算

/// * 5.67 double值转16进制科学记数法

5.67 = 5 + 0.67 = 101.10101011B = 1.0110101011B*10B^2

5 = 101B

0.67 = 10101011B

0.67*2 = 0.34 1

0.34*2 = 0.68 0

0.68*2 = 0.36 1

0.36*2 = 0.72 0

0.72*2 = 0.44 1

0.44*2 = 0.88 0

0.88*2 = 0.76 1

0.76*2 = 0.52 1

 

S = 0

E = 1023 + 2 = 1025 = 10000000001B

D = 0110101011 0000000000 0000000000 0000000000 0000000000 00

 

0 10000000001 0110101011 0000000000 0000000000 0000000000 0000000000 00

 

0100000000010110101011000000000000000000000000000000000000000000

 

0100,0000,0001,0110,1010,1100,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000

4    0   1    6   a    C   0    0   0   0    0    0    0   0   0   0

 

4 016a C0000000000

 

虽然和电脑算的(40 16 ae 14 7a e1 47 ae)不一样,但是我的精度只有小数点后82进制数我用WinHex将电脑算出的double值,换成我的看看和5.67差多少

 

/// 实验证明:我算的是对的

D:\ls\2015_1022\Topic1>call topic1.exe

&fIn = 0012ff78, fIn = 5.670000

40 16 ae 14 7a e1 47 ae

please use winhex to modify fIn value, then press any key to continue

请按任意键继续. . .

&fIn = 0012ff78, fIn = 5.667969

END, press any key to quit

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 16进制double在线换是一种将十六进制换为浮点数格式的操作。这种换通常用于计算机科学领域,其中十六进制数常用于表示存储在计算机中的数据。为了将十六进制换为double类型的数字,需要按照以下步骤操作: 1. 将十六进制换为二进制数。将十六进制数中的每个数字换为4位二进制数,并连接在一起,可以得到等效的二进制数。 2. 确定浮点数的符号位。最高位为符号位,0表示正数,1表示负数。 3. 确定浮点数的指数部分。指数位的长度通常是11位。将指数值换为二进制,再将其与指数的偏移值相加。 4. 确定浮点数的尾数部分。根据IEEE标准,尾数部分通常有52位。将尾数的二进制表示计算出来。 5. 将符号位、指数部分和尾数部分合并,得到十进制数的表示形式。 这是一种比较繁琐的操作,可以使用在线换工具来进行换。不同的在线工具可能会使用不同的换算法,因此使用前需要进行测试,以确保得到正确的结果。 ### 回答2: 16进制double实际上是2进制10进制的一个过程。因为double类型的数据是由64位二进制数表示的,所以我们需要先将16进制的数化为64位的二进制数。 首先,我们需要将每个16进制数字换成4位二进制数。例如,对于16进制数0x3E4A7B9F,在化成2进制时,需要换每位数字(还需在前面补0,使每个数字都成4位): 3 E 4 A 7 B 9 F 0011 1110 0100 1010 0111 1011 1001 1111 接着,我们将这个64位的2进制数按照符号位、指数部分和尾数部分分开。 - 符号位:最高位表示符号位,0代表正数,1代表负数。 - 指数部分:接下来的11位表示指数部分,采用“移码”表示法。对于double类型,采用移码表示法可以使得指数部分可以表示负数。移码的方法是将真实的指数值加上一个固定的偏移量(即1023),并将得到的结果化为2进制数。例如,若真实指数值为20,则移码表示为20 + 1023 = 1043,化为2进制数为10000010011。 - 尾数部分:剩下的52位二进制数表示尾数部分。 最后,我们将符号位、指数部分和尾数部分组合起来,并按照IEEE 754标准解码,就可以得到double类型的数值。 ### 回答3: 16进制是一种计数系统,其中每个数字由0到9和A到F中的一个表示。双精度浮点数则是一种计算机数据类型,用于表示十进制数。在计算机科学中,可以使用在线工具将16进制换为双精度浮点数。以下是如何进行此换的步骤: 1. 确定要换的16进制数,并在在线工具中输入它。 2. 输入后,工具将显示对应的双精度浮点数。 3. 如果需要将双精度浮点数换回16进制,则可以输入该数字,并将其换回16进制。 这些换工具可用于计算机工程师、程序员和开发人员进行高精度计算,并且在进行低级编程时特别有用。它们提供了一种方便的方法,使用户可以快速换数字并进行计算,而不必手动进行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值