【问题标题】:Whats wrong with my math?我的数学怎么了?
【发布时间】:2012-04-15 06:52:29
【问题描述】:

我有一个涉及浮点数和整数的函数。当我运行代码时,结果是错误的。当我为 input_voltage 输入 4.3 时,我得到十进制的 3803 和十六进制的 EDB。正确答案应该是 3808 和 EE0。谁能告诉我可能发生了什么?

#include <stdio.h>

int digital_encoding(float voltage);

int main()
{
    float input_voltage;
    int valid, ch;

    do{
        printf("Please enter the input voltage between 0 and 5 volts: \n");
        valid = scanf("%f", &input_voltage);
        if(input_voltage <= 0){
            printf("Enter a number larger than 0! \n");
            valid = 0;
        }
        if(input_voltage >= 5){
            printf("Enter a number less than 5! \n");
            valid = 0;
        }
    }while(valid != 1);

    digital_encoding(input_voltage);
}
int digital_encoding(float voltage)
{
    int dig_encode;
    dig_encode = ((voltage + 5)*(4095/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", dig_encode, dig_encode);
    return dig_encode;
}

【问题讨论】:

  • 4095.0/10 = 409.5,但是您在除法上使用整数语义,所以只得到 409。像这样指定等式:((voltage+5)*(4095.0/10));((voltage+5)*((double)4095/10))

标签: c floating-point int


【解决方案1】:

4095/10 是 409 而不是 409.5,这是整数运算,所以向下取整。

您可能正在寻找4095.0 / 10 [或只是409.5]

【讨论】:

  • “四舍五入”在考虑负数时可能会令人困惑。使用四舍五入到零。
【解决方案2】:

问题出在这里:

int digital_encoding(float voltage)
{
    **int** dig_encode;
    dig_encode = ((voltage + 5)*(4095/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", dig_encode,    dig_encode);
    return dig_encode;
}

改用这个

int digital_encoding(float voltage)
{
    float dig_encode;
    dig_encode = ((voltage + 5)*(4095.00/10));
    printf("The digital encoding equals %d in decimal, and %X in HEX.\n", (int)dig_encode, (int)dig_encode);
    return (int)dig_encode;
}

【讨论】:

  • 嗯,唯一的问题是*(4095/10)。你解决了这个问题,所以没有反对票,但是dig_encode 的类型和随后的演员毫无意义的改变也意味着没有反对票。
  • 啊,感谢您指出这一点。我只是想我会让他更容易阅读。
【解决方案3】:

我认为您可能需要将 (4095/10) 更改为 (4095.0/10) 否则您将获得该比率的整数运算,而余数会被丢弃。

【讨论】:

    【解决方案4】:

    问题来了:

     int dig_encode;
            dig_encode = ((voltage + 5)*(4095/10));
    

    用float计算结果,然后在使用前将其转换为int。

    dig_encode = (int)((voltage + 5)*(4095/10.0));
    

    【讨论】:

      【解决方案5】:

      4095/10 的结果是 int,所以是 409,而不是 409.5。这是因为这两个数字都是 int。要使结果 float 你可以这样写 4095.0/10

      【讨论】:

        猜你喜欢
        • 2012-09-05
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多