我试图用浮点进行划分。 但问题是我在两个变量中表示浮点数。 Qty_int和Qty_deci。 即,2.5表示为Qty_int = 2,Qty_deci = 5。
我的问题是如何将这种数字与两个分开? 即2.5 / 2,其中两个和五个处于不同的变量。除法必须不昂贵,不得使用浮点数据类型。有没有办法做到这一点??
答案 0 :(得分:2)
如果Qty_deci是整数,则无法区分2.5和2.05。你需要三个变量。
2.5 = (2) + (5) * 10^(-1)
2.05 = (2) + (5) * 10^(-2)
^ ^ ^
| | |
或两个不同的变量,其值不同于当前值。
2.5 = ( 25) * 10^(-1)
2.05 = (205) * 10^(-2)
^ ^
| |
但除非你改用基数2而不是10,否则这没有任何帮助。
2.5 = (0x5000) / 2*(15-2)
2.05 = (0x4199) / 2*(15-2)
^ ^
| |
然后,分裂,因为可能。
2.5 / 2.0
= ( (0x5000) / 2*(15-2) ) / ( (0x4000) / 2*(15-2) )
= (0x5000) * 2*(15-2) / (0x4000) / 2*(15-2)
= (0x5000) << (15-2) / (0x4000) / 2*(15-2)
= (0x2800) / 2^(15-2)
= 1.25
请注意,上述除法是整数除法。
从技术上讲,您甚至不需要存储第二个号码。我们有一台没有浮点运算支持的机器。我们使用了fixed point arithmentic。它基本上与上面的相同,除了你从来没有将第二个数字存储在除评论之外的任何地方。
例如,如果我们有16位变量,我们为符号保留一个,为整数部分保留2位(“B2”),
这相当于输入函数:
int16 qty_B2 = 2.5 * 2**(15-2); // 2.5 B2 = 0x5000
这相当于你的编译器或手工完成:
int16 div_B2 = 2.0 * 2**(15-2); // 2.0 B2 = 0x4000
这就是你如何进行分工:
int32 qty_32_B2 = qty_B2 << 16; // 2.50 B2
int32 qty_32_B4 = qty_32_B2 >> 2; // 2.50 B4
int16 res_B2 = qty_32_B4/div_B2; // 1.25 B4-B2=B2
相当于这个将由输出函数完成:
printf("%f", res / 2**(15-2));
请注意,上述除法是整数除法。
答案 1 :(得分:1)
Qty_deci
是一个字符串吗?如果没有,你将如何代表2.01?
我建议你强烈反对实现自己的自定义浮点格式。重新考虑使用本机浮点格式(不使用它的原因是什么?),或使用实现任意精度十进制数学的库。