Мне нужна помощь с плавающей точкой - PullRequest
2 голосов
/ 15 сентября 2011

Я очень плохо знаком с программированием, беру свой первый урок информатики. Я пишу программу, и по какой-то причине, когда я пытаюсь вычислить значение с плавающей запятой любой операции, это просто приводит к 0,00000. Если кто-нибудь может помочь мне, я буду очень признателен!

    #include <stdio.h>

    int main(void)
    {
          int numa, numb;
          int sum, halffirst, halfsecond, quotient, remainder;


          // get input
          printf("\nPlease enter two integers: ");
          scanf("%d%d", &numa, &numb);  

          // calculate dimensions
          sum = numa + numb;
          halffirst = (double)numa / 2.0;
          halfsecond = numb / 2;
          quotient = numa / numb;
          remainder = numa % numb;

          // display report
          printf("\n%20s%20s", "Description", "Data");
          printf("\n%20s%20s", "-----------", "----");
          printf("\n%20s%20d", "Sum", sum );
          printf("\n%20s%20lf", "Half (1st #)", halffirst);
          printf("\n%20s%20d", "Half (2nd #)", halfsecond);
          printf("\n%20s%20lf", "Quotient", quotient);
          printf("\n%20s%20d", "Remainder", remainder);

          // format and finish
          printf("\n\n");
          return 0;
    }

Ответы [ 6 ]

2 голосов
/ 15 сентября 2011

Это потому, что вы используете тип данных int, который является целым числом. Операции, выполняемые над целыми числами, как правило, производят целые числа (усеченные), поэтому что-то вроде:

int nom = 6;
int den = 10;
float frac = nom / den;

даст вам нулевое значение, поскольку арифметика выполняется для целых чисел и конвертируется только в число с плавающей точкой в ​​конце (после нанесения урона).

Вы можете обойти это, разыграв, например:

float frac = (float)nom / (float)den;

, который сделает значения с плавающей запятой из целых чисел до деления.

Однако вам лучше использовать плавающую точку для всех ваших значений заранее. float (одинарная точность) или double (двойная точность) - это то, что вам нужно. Значения двойной точности имеют больше ... ну, точность означает, что они могут хранить больше цифр и больший диапазон чисел. Для работы в классе float, вероятно, должно быть хорошо.

1 голос
/ 23 августа 2012

В соответствии со стандартом C-99, раздел 7.19.6.1, параграф 9

Если спецификация преобразования недопустима, поведение не определено.251) Если какой-либо аргумент не является правильным типом для соответствующего преобразованияспецификации, поведение не определено.

halffirst и quotient определяется как int, но в вызовах printf вы используете %lf, который является спецификатором для double

     printf("\n%20s%20lf", "Half (1st #)", halffirst);
     printf("\n%20s%20lf", "Quotient", quotient);

Это неопределенное поведение в соответствии со стандартом.

Используйте %d для печати целых чисел

     printf("\n%20s %d", "Half (1st #)", halffirst);
     printf("\n%20s %d", "Quotient", quotient);

ИЛИ, приведите целые числа к floatперед передачей

     printf("\n%20s%20lf", "Half (1st #)", (float)halffirst);
     printf("\n%20s%20lf", "Quotient", (float)quotient);

или введите int для плавания перед передачей.

1 голос
/ 15 сентября 2011

Вы должны присвоить свои переменные как float или double, чтобы сохранить правильное значение вместо использования целых чисел.

double sum, halffirst, halfsecond, quotient, remainder;

Замените строку:

int sum, halffirst, halfsecond, quotient, remainder;

на приведенную выше.

0 голосов
/ 17 сентября 2011

Типы - это кошмар для начинающего программиста. Вы имеете дело с двумя типами здесь: int, целочисленное значение и double, число с плавающей запятой двойной точности.

C и подобные языки очень педантичны в отношении типов, приведения и принуждения. Вы должны быть очень осторожны при работе с несколькими типами в одном выражении. Разбивая вашу линию halffirst = (double)numa / 2.0; шаг за шагом. Давайте использовать пример; скажем numa имеет значение 5.

  • Сначала приведите numa к double. Это отлично. Теперь у вас 5,0 в качестве делителя.
  • Разделите на 2,0. Дивиденд 5,0 является двойным, а делитель 2,0 является двойным, поэтому результат (естественно) будет двойным, 2,5. Тоже хорошо.
  • Сохранить результат в halffirst. halffirst - это тип int; мы не можем напрямую сохранить значение double в переменной int. Поэтому мы должны преобразовать это; (int)2.5 дает 2, поэтому мы сохраняем 2 в halffirst.

Если вы хотите сохранить результат double вашего деления, вам нужно объявить переменную назначения, halffirst, как тип double, в противном случае неявное преобразование в конце вас зацепит. halfsecond точно так же, по той же причине. Поэтому в ваших объявлениях в верхней части метода main попробуйте следующее:

int numa, numb;
int sum, quotient, remainder;
double halffirst, halfsecond;

Имеет смысл?

0 голосов
/ 15 сентября 2011

Пара вещей:

  1. Если вы хотите использовать числа с плавающей запятой в качестве переменных, то вы должны объявить свои переменные как float, а не int.В C и C ++, когда вы делите число и присваиваете ему int, результат удаляет все десятичные дроби, оставляя в переменной только действительное число.
  2. Если вы погружаетесь иу вас есть целое число в знаменателе, вы должны привести целое число к числу с плавающей точкой, например:

    int num1 = 1, num2 = 2; float theDiv = num1/(float)num2;

Если вы этого не сделаетечто он также сбрасывает десятичные дроби.

0 голосов
/ 15 сентября 2011

Все ваши переменные объявлены как int.

Попробуйте использовать float или double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...