【问题标题】:Double not storing number in C (is the number too small) [duplicate]双重不在C中存储数字(数字太小)[重复]
【发布时间】:2017-11-27 05:06:21
【问题描述】:

这是我的问题,我需要计算一个毫秒内有多少个时钟周期,而我们的 pll 在 TM4C123 上等待。然而,我的双精度值显示为零,这使我的其他值不正确。任何帮助将不胜感激。

#include <stdio.h>

int main()
{
    float ms_cycled;
    float us_cycled;
    int ms_cycle;
    int us_cycle;
    unsigned long MHz = 50;
    double TPC = 1/(MHz*10000000); //calculate time per clock cycle

    //calculate cycles for ms
    ms_cycled = 0.001/TPC;
    ms_cycle = ms_cycled;
    //calculate cycles for us
    us_cycled = 0.000001/TPC;
    us_cycle = us_cycled;
    printf("TPC = %.16f \n", TPC);
    printf("ms_cycled = %f \n", ms_cycled);
    printf("us_cycled = %f \n", us_cycled);
    printf("ms_cycle = %i \n", ms_cycle);
    printf("us_cycle = %i \n", us_cycle);
    return 0;
}

我得到的输出是:

TPC = 0.0000000000000000                                                                                                                             
ms_cycled = inf                                                                                                                                      
us_cycled = inf                                                                                                                                      
ms_cycle = -2147483648                                                                                                                               
us_cycle = -2147483648

【问题讨论】:

  • 这是我见过的计算每毫秒时钟的最低效的方法。如果你有MHz,你就有每秒时钟。每毫秒的时钟数只是它的 1/1000 倍。每 µs 的时钟也是如此,这又是 1/1000 的因子。 ms_cycle = MHZ * 1000; us_cycle = MHz。当您将 MHz 乘以 10^7 而不是 10^6 时,TPC 的值会减少 10 倍。

标签: c floating-point integer


【解决方案1】:
double TPC = 1/(MHz*10000000);

请注意,您使用的是整数运算。所以你得到1/(50*10000000) = 1/500000000 = 0unsigned long 类型)。从unsigned long 转换为零到double 只会给你0.0,而不是正确的结果。

将其中一个操作数更改为浮点运算应该可以解决问题:

double TPC = 1.0/(MHz*10000000.0)
              ^^              ^^

您也可以更改它以获得相同的结果:

double MHz = 50.0;
               ^^

【讨论】:

  • 请注意,如果将MHz 更改为double,则将其他数字转换为浮点数不再重要,因为MHzdouble 确保了计算在double 算术中完成。
  • 问题不在于你是否知道;这是OP是否知道它。类型一致性还不错,但并不总是必要的。
  • @JonathanLeffler 知道了。我现在重新措辞了我的答案。
  • 你好,请问1.0和1.0f有什么区别吗?我知道你可以写这两种方式,但我不知道有什么区别
  • @Cjdcoy 1.0double 类型,而 1.0ffloat 类型。
【解决方案2】:

表达式1/(MHz*10000000) 的类型为unsigned long,值为0。将结果存储在double 中不会使结果小于零。请改用1.0/(MHz*10000000)

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 2015-03-14
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2016-08-14
    相关资源
    最近更新 更多