首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有太多开销的特殊浮点分区

没有太多开销的特殊浮点分区
EN

Stack Overflow用户
提问于 2011-04-23 17:18:34
回答 2查看 159关注 0票数 0

我正在尝试用浮点数做除法。但问题是我用两个变量来表示浮点数。Qty_int和Qty_deci。即2.5表示为Qty_int = 2,Qty_deci = 5。

我的问题是如何将这种数字除以2?IE2.5/2,其中2和5是不同的变量。除法的开销不能太大,并且不能使用float数据类型。有没有办法做到这一点??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-23 17:43:53

如果Qty_deci是一个整数,你不能区分2.5和2.05。你需要三个变量。

代码语言:javascript
复制
2.5  = (2) + (5) * 10^(-1)
2.05 = (2) + (5) * 10^(-2)
        ^     ^         ^
        |     |         |

或者两个不同的变量,它们的值与当前值不同。

代码语言:javascript
复制
2.5  = ( 25) * 10^(-1)
2.05 = (205) * 10^(-2)
          ^         ^
          |         |

但这没有任何帮助,除非你改用基数2而不是10。

代码语言:javascript
复制
2.5  = (0x5000) / 2*(15-2)
2.05 = (0x4199) / 2*(15-2)
             ^          ^
             |          |

然后,除法,因为可能。

代码语言:javascript
复制
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函数完成:

代码语言:javascript
复制
int16 qty_B2 = 2.5 * 2**(15-2);  // 2.5 B2 = 0x5000

与此等效的操作将由您的编译器或手动完成:

代码语言:javascript
复制
int16 div_B2 = 2.0 * 2**(15-2);  // 2.0 B2 = 0x4000

这是你做除法的方法:

代码语言:javascript
复制
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

与此等效的操作将由输出函数完成:

代码语言:javascript
复制
printf("%f", res / 2**(15-2));

请注意,上面的除法是整数除法。

票数 2
EN

Stack Overflow用户

发布于 2011-04-23 17:24:49

Qty_deci是字符串吗?如果不是,你将如何表示2.01?

我强烈建议您不要实现您自己的自定义浮点格式。重新考虑使用原生浮点格式(您不使用它的理由是什么?),或者使用实现任意精度小数计算的库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5763372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档