对于罗嗦的标题感到抱歉。我的代码针对的是没有浮点单元的微控制器(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然后分割和向下转换它将放入的数组,试图在这里试图减少内存)
答案 0 :(得分:2)
如果你写一个浮点乘法,我知道没有编译器可以确定有一种方法可以用定点来实现。 (这并不意味着它们不存在,但它......似乎不太可能。)
我认为你简化了一些重要的事情,因为你似乎可以做到:
result = multip * 1125;
直接获得最终结果。
如果有一些原因你不能乘以1125,我会选择chux's formula。
答案 1 :(得分:2)
结果不是整数;它舍入为整数。
9375 * 1.8000000000000000444089209850062616169452667236328125
产量
16875.0000000000004163336342344337026588618755340576171875
以(以双精度浮点数)舍入到16875。
答案 2 :(得分: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;
答案 3 :(得分:0)
如果int x
为非负数,则可以使用x *= 1.8
算术将int
四舍五入到最接近,除非最终结果溢出,否则不会溢出:
x - (x+2)/5 + x
对于截断而不是舍入到最近,请使用:
x - (x+4)/5 + x
如果x
可能是否定的,则需要做一些额外的工作。