在没有任何库的情况下拆分双c

时间:2010-05-08 20:52:14

标签: c double

您好我有一个c程序员的问题,我们在学校进行测试,在我们老师的操作系统中创建一个软实时系统。

嗯,这一切都很好,花花公子,我们选择创建一个系统,根据他或她的血糖计算糖尿病患者需要多少药物。只要我们有一个实时系统的想法,它就不需要是正确的:D

但是我们的计算医学单位的计算方法有点麻烦

[blood sugar] * 1.2

但是我们可以在进程之间发送消息的唯一方法是通过一个包含8个long的结构,但这里是我对c的知识结束的地方,我们需要某种方法将这个double分成2个long,例如:整数在长0和长1的小数,然后在另一侧汇编。但我不知道该怎么做,所以需要一些帮助。

我们已经尝试过但我们无法访问c标准库

2 个答案:

答案 0 :(得分:2)

如果你不需要特别高的精度,只需使用缩放的整数:将双倍乘以10的幂,将其转换为整数(删除剩余的十进制数字),然后发送长整数。另一方面,你可以撤消这些步骤。

如果您需要更高的精度,可以使用modf将数字拆分为积分部分和小数部分,然后仅缩小小数部分。

答案 1 :(得分:2)

肮脏的技巧,将你的双倍的实际表示存储在长片中(假设它们的大小匹配):

double yourVar = yourValue;
long * read = (long *)&yourVar;
yourStruct.long1 = *read;
yourStruct.long2 = *(read + 1);

在另一边重新组装:

double yourVar;
long * read = (long *)&yourVar;
*read = yourStruct.long1;
*(read + 1) = yourStruct.long2;

基本上你是在作弊;你得到一个指向你的变量的指针,它是一个double,但你告诉编译器它实际上是一个指向两个连续long变量的指针。然后,你从它们读取和写入,但实际发生的是你正在移动基础位表示,换句话说,两个结果long变量对你的数字没有意义(它们不是整数部分或者例如小数部分。)

当然,这只适用于:

sizeof(long) * 2 >= sizeof(double)
在您的平台上

,并且通信协议不会以任何方式改变变量的按位表示。