您好我有一个c程序员的问题,我们在学校进行测试,在我们老师的操作系统中创建一个软实时系统。
嗯,这一切都很好,花花公子,我们选择创建一个系统,根据他或她的血糖计算糖尿病患者需要多少药物。只要我们有一个实时系统的想法,它就不需要是正确的:D
但是我们的计算医学单位的计算方法有点麻烦
[blood sugar] * 1.2
但是我们可以在进程之间发送消息的唯一方法是通过一个包含8个long的结构,但这里是我对c的知识结束的地方,我们需要某种方法将这个double分成2个long,例如:整数在长0和长1的小数,然后在另一侧汇编。但我不知道该怎么做,所以需要一些帮助。
我们已经尝试过但我们无法访问c标准库
答案 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)
在您的平台上,并且通信协议不会以任何方式改变变量的按位表示。