Member 13683920 Ответов: 2

Проблема при преобразовании градуса Цельсия в градус Фаренгейта


I am getting wrong output for below code.

    int C,i;
    for (i=0;i<=300;i=i+20)
    {
        C=(5/9)*(i-32);
        printf("%d %d\n",i,C);
    }


Что я уже пробовал:

but below code works fine. Confused why it is not working! Any help?

    int C,i;
    for (i=0;i<=300;i=i+20)
    {
        C=(5*(i-32)/9);
        printf("%d %d\n",i,C);
    }

phil.o

В первой версии 5/9 переводится в ноль (целочисленное деление). Таким образом, операция фактически равна 0 * (i - 32), что всегда дает ноль.
Во второй версии вы делаете деление в конце, что дает ненулевой результат, но это не означает, что этот результат полностью точен.

2 Ответов

Рейтинг:
7

CPallini

Как указывалось выше Фил.о ваша проблема-это целочисленная арифметика. Пожалуйста, обратите внимание, что ваша вторая функция работает не очень хорошо (по крайней мере, не самая точная). Попробуй

#include <stdio.h>
#include <math.h>

int op1(int i)
{
  return (5/9)*(i-32);
}

int op2(int i)
{
  return (5*(i-32)/9);
}

double dfc(int i)
{
  return (5.0/9)*(i-32.0);
}

int ifc(int i)
{
  return (int) round((5.0/9)*(i-32.0));
}


int main()
{
  int i;
  for (i=0;i<=300;i=i+20)
  {
    printf("% 3d % 3d % 5.2f % 3d\n", op1(i), op2(i), dfc(i), ifc(i));
  }
}


То ifc функция дает целочисленный результат, ближайший к фактическому действительному значению (аппроксимируемому dfc функция).


phil.o

Мои 5 за предоставление альтернативы. Я добавил комментарий к этому вопросу, чтобы лучше объяснить разницу между обоими вычислениями.

Рейтинг:
20

phil.o

Это происходит потому, что вы используете целочисленный тип, так что вы получаете целочисленное деление, который удаляет дробную часть.
Попробуй

float C, i;
for (i = 0.0; i <= 300.0; i += 20.0) {
   C = (5.0 / 9.0) * (i - 32.0);
   printf("%f %f", i, C);
}

Это должно сработать.
Вообще говоря, для таких вычислений целочисленные типы не подходят, потому что вам нужны действительные числа, а не целочисленные.


CPallini

5.