0

float と int を含む関数があります。コードを実行すると、結果が間違っています。input_voltage に 4.3 を入力すると、10 進数に 3803、16 進数に 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;
}
4

5 に答える 5

6

4095/10は409であり、409.5ではありません。これは整数演算であるため、切り捨てられます。

4095.0 / 10あなたはおそらく[または単に409.5]を探してい ます

于 2012-04-15T06:56:50.460 に答える
1

問題はここにあります:

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;
}
于 2012-04-15T07:05:48.567 に答える
1

(4095/10)を(4095.0 / 10)に変更する必要があると思います。そうしないと、その比率で整数演算が行われ、余りは破棄されます。

于 2012-04-15T06:57:53.073 に答える
1

問題はここにあります:

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

結果をfloatで計算し、使用する前にintにキャストします。

dig_encode = (int)((voltage + 5)*(4095/10.0));
于 2012-04-15T06:58:07.783 に答える
0

結果4095/10intなので、409.5ではなく409になります。これは、両方の数値がintであるためです。結果をフロートにするには、次のように記述できます4095.0/10

于 2012-04-15T06:59:10.450 に答える