【问题标题】:Float versus integer data type calculation issues in CC中的浮点数与整数数据类型计算问题
【发布时间】:2010-02-28 22:31:12
【问题描述】:

当我将浮点数 * 12 相乘时,以下代码不会产生我期望的答案。

void setup_timer_parameters(float micro_seconds)
{
   //constants
   calibration = 0;

   //calculables
   periods_needed = micro_seconds * 12 + calibration;

   target_overflows = periods_needed / 65536;
   overflows_counter = target_overflows;

   temp = periods_needed - (target_overflows * 65536);
   leftover = (long)temp;
   //int overflows_needed = micro_seconds % timer_period;
   printf(lcd_putc, "\fPN%05f TMP%05f\nTO%05f LO%05f", periods_needed, temp, target_overflows, leftover);
}

void main(){
   setup_timer_parameters(20000F);
}

由于某种原因,我的显示器显示 period_needed 是 -518!为什么不是 20000*12 = 240000?

【问题讨论】:

  • 没有periods_neededcalibration类型的定义,我们无从得知。我敢打赌,periods_needed 有点短,但你没有提供所有代码。
  • period_needed、temp、target_overflows、leftover的类型有哪些?请给代码。
  • 什么是 period_needed 声明?是整数吗?是浮子吗?
  • 您可能需要编写 12.0,但是您遗漏的所有内容谁能说得清?
  • period_needed 和 target_overflows 是什么类型?

标签: c types primitive-types


【解决方案1】:

您是否正在为嵌入式平台进行编译?

也许您的默认 int 只有 2 字节宽,在这种情况下 12 * 20000 会溢出。

【讨论】:

    【解决方案2】:

    这不是严格意义上的 ANSI C,但试试这个:

    void setup_timer_parameters(float micro_seconds)
    {
       //constants
       float calibration = 0;
    
       //calculables
       float periods_needed = micro_seconds * 12.0 + calibration;
    
       float target_overflows = periods_needed / 65536;
       float overflows_counter = target_overflows;
    
       float temp = periods_needed - (target_overflows * 65536);
       float leftover = (long)temp;
       //int overflows_needed = micro_seconds % timer_period;
    
    
       fprintf(lcd_putc, "\fPN%05f TMP%05f\nTO%05f LO%05f", periods_needed, temp, target_overflows, leftover);
    }
    
    int main(int argc, char** argv)
    {
       setup_timer_parameters(20000F);
       return 0;
    }
    

    看起来您没有声明任何变量类型,除非它们在其他地方声明(?),否则这真的会让事情变得不安。您可能需要根据您是否真的需要浮点数来更改类型,例如,long int 可能适用于其中一些,或者如果您需要更高的精度,则可以使用 double。

    如果您需要任意精度,请查找 MPFR/MPIR。

    【讨论】:

    • 肯定是 fprintf,看起来 lcd_putc 可能是液晶显示器的句柄?
    • 它们在别处都被声明为浮点数。很抱歉没有包括我的所有代码。事实上,根本没有铸造任何东西。使用 12.0 而不是 12 并没有改变答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2012-01-14
    • 2018-03-22
    • 1970-01-01
    • 2011-02-02
    • 2011-02-02
    • 2021-06-05
    相关资源
    最近更新 更多