0

对不起,冗长的标题。我的代码针对的是没有浮点单元的微控制器(msp430),但这应该适用于任何类似的 MCU。

如果我将一个大的运行时变量与通常被认为是浮点十进制数 (1.8) 相乘,这仍然被 MCU 或编译器视为浮点数学吗?

我的简化代码是:

int multip = 0xf;          // Can be from 0-15, not available at compile time
int holder = multip * 625; // 0 - 9375
holder = holder * 1.8;     // 0 - 16875`

由于结果总是一个正整数,实整数,就 MCU 或编译器而言,它仍然是浮点数学,还是定点数?

(我意识到我可以乘以 18,但这需要声明一个 32 位长而不是 16 位 int,然后对将要放入的数组进行除法和向下转换,试图在这里节省内存)

4

4 回答 4

2

如果您编写浮点乘法,我知道没有编译器会确定有一种方法可以用定点代替。(这并不意味着它们不存在,但......似乎不太可能。)

我假设您简化了一些重要的事情,因为您似乎可以这样做:

result = multip * 1125;

并直接得到最终结果。

如果出于某种原因你不能只乘以 1125,我会选择chux 的公式。

于 2013-09-18T00:20:37.923 回答
2

结果不是整数;它四舍五入为整数。

9375 * 1.8000000000000000444089209850062616169452667236328125

产量

16875.0000000000004163336342344337026588618755340576171875

将(双精度浮点数)四舍五入为 16875。

于 2013-09-18T01:24:20.353 回答
0

如果int x是非负数,您可以x *= 1.8仅使用算术计算四舍五入到最接近int,除非最终结果溢出,否则不会溢出,其中:

x - (x+2)/5 + x

对于截断而不是四舍五入,请使用:

x - (x+4)/5 + x

如果x可能是负数,则需要进行一些额外的工作。

于 2013-09-18T01:46:00.737 回答
0

将为您创建自信的 FP 代码

holder = holder * 1.8

为了避免 FP 和 32 位数学,给定 OP 值

int multip = 0xf;    // Max 15
unsigned holder = multip * 625; // Max 9375
// holder = holder * 1.8; 
// alpha depends on rounding desired,  e.g. 2 for round to nearest.
holder += (holder*4u + alpha)/5;
于 2013-09-18T00:15:21.213 回答