如何将double型转换为INT64,保证精度

lwlgg1988 2013-09-16 04:34:06
计算出一个double值,现在想通过移位进行拆分发送数据,如何实现不损失精度而且转换为64位整形INT64呢?
先行谢过各位大神
...全文
1928 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2013-09-17
  • 打赏
  • 举报
回复
直接二进制发送撒, 点点精度都不会损失, 原样发送. double val = xxxxx; send( s, (char*)&val, sizeof(double),0) char buf[0x10] = {0}; recv(s, buf, 0x10, 0); double rc = *(double*)buf; 注意, 有个前提, 就是发送端和接收端的字节序相同. 当然, 你也可以一个一个放, 这样就不用管字节序问题了.
sduxiaoxiang 2013-09-17
  • 打赏
  • 举报
回复
int64 *val = (int64*)&dVal; val是int64,然后按符号位 指数位 和小数位处理,不丢失精度 如果为了网络传输,直接发double就是
nice_cxf 2013-09-17
  • 打赏
  • 举报
回复
注意大小端,直接发double就可以了,转什么__int64
神农氏 2013-09-17
  • 打赏
  • 举报
回复
引用 12 楼 max_min_ 的回复:
[quote=引用 8 楼 mmns 的回复:] 我上面写的是数值转换。 如果是只为了网络传输。那不用转成int64,直接发送你的double就可以。接收的时候收到一个double就可以了。不存在问题。
arm下double类型网传有问题的!已经遇到过多次了、、[/quote] 那是因为arm环境下发送端和接收端double的存储标准不一致(或发送端和接收端大小端不一致)造成的,只需要转换一下就可。这个网络传输没有关系。
max_min_ 2013-09-16
  • 打赏
  • 举报
回复
引用 8 楼 mmns 的回复:
我上面写的是数值转换。 如果是只为了网络传输。那不用转成int64,直接发送你的double就可以。接收的时候收到一个double就可以了。不存在问题。
arm下double类型网传有问题的!已经遇到过多次了、、
zhaokai115 2013-09-16
  • 打赏
  • 举报
回复
引用 楼主 lwlgg1988 的回复:
计算出一个double值,现在想通过移位进行拆分发送数据,如何实现不损失精度而且转换为64位整形INT64呢? 先行谢过各位大神
把下面的float换成double,unsigned int换成INT64 原贴见http://bbs.csdn.net/topics/390584550
union x {
    float        f;
    unsigned int u;
};
 
unsigned int pack_float(float f)
{
    union x v;
    v.f = f;
    return v.u;
}
 
float unpack_float(unsigned int u)
{
    union x v;
    v.u = u;
    return v.f;
}
lm_whales 2013-09-16
  • 打赏
  • 举报
回复
移位进行拆分发送数据,你只想,把数据原样传输,还是作为 整型数据传输 原样传输: VC __int64 d; 发送端 :d = *(__int64*)&f; //传输 d -----> 得到 d; 接收端: f =*(double*)d; 如果用转换,损失精度,是必然的
mstlq 2013-09-16
  • 打赏
  • 举报
回复
按8楼的思路就可,注意字节序就ok
神农氏 2013-09-16
  • 打赏
  • 举报
回复
我上面写的是数值转换。 如果是只为了网络传输。那不用转成int64,直接发送你的double就可以。接收的时候收到一个double就可以了。不存在问题。
神农氏 2013-09-16
  • 打赏
  • 举报
回复
int64 convert(double value) { int64 re = 0; double val = value>0?value:-value; /* 求高32位 */ doulbe high = val/4294967295; //4294967295就是2的32次方 /* 求低32位,也可以用fmod()求低32位,我的经验是有的时候fmod不太可靠:) */ double low = val-high*4294967295; re =(unsigned int)high; re <<=32; re |= (unsigned int)low; if( value<0) { re = -re ; } return re; } ///注意:1. 经过上面处理,value的小数不分会被抛弃。 /// 2. value 的值不能超过2的64次方,否则会溢出。 /// 3. value 的值不能超过2的63次方,否则会符号溢出。 /// 4. 这段代码我没测,但我觉得没啥问题。:)
jiht594 2013-09-16
  • 打赏
  • 举报
回复
转成字符串呢
Saleayas 2013-09-16
  • 打赏
  • 举报
回复
double f = 1.0; writebyte(sizeof(f), &f);
max_min_ 2013-09-16
  • 打赏
  • 举报
回复
引用 2 楼 lwlgg1988 的回复:
[quote=引用 1 楼 max_min_ 的回复:] 小数整数部分分开保存
能不能给个代码,比如 double d = 1/48 * 1000000000; 转换为INT64? 请不吝赐教[/quote] 显然你这样是不行的!已经有数据精度丢失了 是不是经过网络传送 double类型数据得不到正确数据了?
majia2011 2013-09-16
  • 打赏
  • 举报
回复
double是10字节吧 int64是几字节的?能放下吗?
lwlgg1988 2013-09-16
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
小数整数部分分开保存
能不能给个代码,比如 double d = 1/48 * 1000000000; 转换为INT64? 请不吝赐教
max_min_ 2013-09-16
  • 打赏
  • 举报
回复
小数整数部分分开保存

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧