我正在尝试用浮点数做除法。但问题是我用两个变量来表示浮点数。Qty_int和Qty_deci。即2.5表示为Qty_int = 2,Qty_deci = 5。
我的问题是如何将这种数字除以2?IE2.5/2,其中2和5是不同的变量。除法的开销不能太大,并且不能使用float数据类型。有没有办法做到这一点??
发布于 2011-04-23 17:43:53
如果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位变量,我们为符号保留了一个位,为整数部分保留了两位("B2"),
与此等效的操作将由input函数完成:
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));请注意,上面的除法是整数除法。
发布于 2011-04-23 17:24:49
Qty_deci是字符串吗?如果不是,你将如何表示2.01?
我强烈建议您不要实现您自己的自定义浮点格式。重新考虑使用原生浮点格式(您不使用它的理由是什么?),或者使用实现任意精度小数计算的库。
https://stackoverflow.com/questions/5763372
复制相似问题