乘以十进制数,其中所有结果都是完整整数,被认为是浮点数学?

时间:2013-09-17 23:45:37

标签: c floating-point fixed-point

对于罗嗦的标题感到抱歉。我的代码针对的是没有浮点单元的微控制器(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 个答案:

答案 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可能是否定的,则需要做一些额外的工作。