您的位置:程序门 -> c/c++ -> c++ 语言



如何将一个double类型的数,拆成两个unsigned long数


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何将一个double类型的数,拆成两个unsigned long数
发表于:2008-01-18 18:16:07 楼主
例如一个double类型的数:1.719e18,现在我想将它用8个字节以二进制流的形式存放在文件里,把它拆成两个unsigned   long型,前4字节表示高位,后4字节表示低位,例如,1.719e18用二进制流表示就是   17   db   1d   64   70   e5   80   00,把这8个字节存写入文件,应该问么做?用windows自带的计算器将1.719e18转换成二进制数是17   db   1d   64   70   e5   80   00,但是用vc编译器运算时会丢精度,该怎么解决呢?因为是关于时间的运算,所以必须要求精确,不能有误差。
示例代码如下:
  double   long   time   =   1.719e18;
  double   long   v_h   =   time   /   ulong_max;
  unsigned   long   ulv_h   =   (unsigned   long   )v_h;
 
  double   long   v_l   =   time   -   (double   long)ulv_h*ulong_max;
  unsigned   long   ulv_l   =   (unsigned   long   )v_l;

  ulv_h表示高位,ulv_l表示低位。
但这么做不行,会丢失精度,清高手指点。

 
发表于:2008-01-18 18:23:021楼 得分:0
这个我只知道汇编可以实现,你可以用c、c++与汇编混合编程。其他的不知了。不过本人水平低,等楼下的高手顶吧。
发表于:2008-01-18 18:37:372楼 得分:0
如果要最简单的处理方式:
#include   "stdafx.h"
#include   "memory.h"

void   tolong(double   r,   long&   a,   long&   b)
{
char   buffer[sizeof(double)];
memcpy(buffer,   &r,   sizeof(double));

memcpy(&a,   buffer,   sizeof(long));
memcpy(&b,   buffer+sizeof(long),   sizeof(long));
}

void   todouble(double&   r,   long   a,   long   b)
{
char   buffer[sizeof(double)];
memcpy(buffer,   &a,   sizeof(long));
memcpy(buffer+sizeof(long),   &b,   sizeof(long));

memcpy(&r,   buffer,   sizeof(double));
}

int   main(int   argc,   char*   argv[])
{
double   r   =   1.719e18;
long   a   =   0;
long   b   =   0;
tolong(r,   a,   b);
double   rr   =   0;
todouble(rr,   a,   b);
printf("%f",   r   -   rr);

return   0;
}
如果要解决负数,请把上面的long类型全换成unsigned   long
发表于:2008-01-18 18:37:463楼 得分:0
不太明白楼主的意思。如果是要把double型的8个字节存成2个dword,可以用取地址然后强制转换指针的方法。例如:
double   d1;
dword   d2,   d3;
d2   =   *(pdword)&d1;
d3   =   *((pdword)&d1+1);
发表于:2008-01-19 15:12:544楼 得分:0
不明白楼主的意思。
标准double型,一个符号位,接下来11个有效位,接下来53个指数位。
ilp32电脑上,long占4个字节
再考虑字节序问题。

这就是原理。
vc没用过,不知是否符合这个标准。
发表于:2008-01-20 00:34:255楼 得分:0
        *   yuanchuang
        *   .
        *   等   级:


发表于:2008-01-19   15:12:544楼   得分:0
不明白楼主的意思。
标准double型,一个符号位,接下来11个有效位,接下来53个指数位。
ilp32电脑上,long占4个字节
再考虑字节序问题。

这就是原理。
vc没用过,不知是否符合这个标准。
===============
笔误,11个指数位,53个有效数字位


快速检索

最新资讯
热门点击