特殊浮动部门没有太多开销

时间:2011-04-23 09:18:34

标签: floating-point

我试图用浮点进行划分。 但问题是我在两个变量中表示浮点数。 Qty_int和Qty_deci。 即,2.5表示为Qty_int = 2,Qty_deci = 5。

我的问题是如何将这种数字与两个分开? 即2.5 / 2,其中两个和五个处于不同的变量。除法必须不昂贵,不得使用浮点数据类型。有没有办法做到这一点??

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?

我建议你强烈反对实现自己的自定义浮点格式。重新考虑使用本机浮点格式(不使用它的原因是什么?),或使用实现任意精度十进制数学的库。