【问题标题】:Is Multiplying a decimal number where all results are full integers, considered Floating Point Math?是否乘以所有结果都是完整整数的十进制数,被认为是浮点数学?
【发布时间】:2013-09-17 23:45:36
【问题描述】:

抱歉标题冗长。我的代码针对的是没有浮点单元的微控制器 (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,然后对将要放入的数组进行除法和向下转换,试图在此处节省内存)

【问题讨论】:

  • 当你说“浮点数”时,你是指IEEE-754 variety吗?
  • 根据我的经验,大多数编译器将 1.8 视为浮点数,即使您的芯片上没有浮点单元。但是浮点数的运算比整数的运算成本高得多。所以这取决于你的要求。
  • 为什么积极性很重要?
  • @user2357112 已修复。表示完整的整数。
  • @RobertHarvey 我会这么认为

标签: c floating-point fixed-point


【解决方案1】:

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

9375 * 1.8000000000000000444089209850062616169452667236328125

产量

16875.0000000000004163336342344337026588618755340576171875

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

【讨论】:

  • 那是因为编译器或单片机固有地将 1.8 视为浮点数,立即造成不精确对吧?耻辱。谢谢。
  • 你总是可以用holder *= 2; holder -= holder/10;进行计算
  • @cde 不是 MCU,而是编译器将 1.8 视为浮点数。 MCU很愚蠢,它只执行十六进制文件中的指令(链接器的输出)。所以优化浮点运算的是编译器。
【解决方案2】:

如果您编写浮点乘法,我知道没有编译器会确定有办法在定点中执行此操作。 (这并不意味着它们不存在,但……似乎不太可能。)

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

result = multip * 1125;

直接得到最终结果。

如果出于某种原因你不能只乘以 1125,我会选择 chux's formula

【讨论】:

    【解决方案3】:

    将为

    创建自信的 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;
    

    【讨论】:

      【解决方案4】:

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

      x - (x+2)/5 + x
      

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

      x - (x+4)/5 + x
      

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

      【讨论】:

        猜你喜欢
        • 2019-03-12
        • 1970-01-01
        • 2018-09-29
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2011-09-19
        • 2023-01-25
        相关资源
        最近更新 更多