Jaqross Ответов: 2

Взятие mod плавающего числа в C


Привет, ребята.Я попытался взять мод числа с плавающей точкой, чтобы понять, является ли оно целым числом или нет.Я хочу вывести число с плавающей точкой как целое число, если оно не имеет никакого остатка.Я имею в виду, если результат равен "4.00(float)" Я хочу напечатать "4".С другой стороны,если это число, например 1.50, я хочу напечатать то же самое снова.
Я предполагаю, что в библиотеке math.h есть функция "modf", чтобы взять остаток от x/y, но она не работает :(
(другие части работают без каких-либо проблем)




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

float operation(float num1,char op,float num2)
{
   float res;
   float c=modf(res,1);//Error is here.I tried to take remaining from result/1.
   if(op=='+')
   {
      res=num1+num2;
   }
   else if(op=='-')
   {
      res=num1-num2;
   }
   else if(op=='*')
   {
      res=num1*num2;
   }
   else if(op=='/')
   {
      res=num1/num2;
   }
   else
   {
      printf("Error!Something wrong about operator.");
   }
   if(c==0)
   {
      printf("=%0.2f",res);//if remainder=0 that means it's an integer.
   }
   else if(c!=0)
   {
      printf("%d",(int)res);//if remainder is not 0 that means it's a float.
   }
}


main()
{
   printf("Welcome to Basic Calculator---Made by Cevik Cukurova\n");
Start:
   int dec;
   float num1,num2;
   char op;
   printf("Please enter the operation.\n ");
   scanf("%f",&num1);
   scanf("%c",&op);
   scanf("%f",&num2);
   operation(num1,op,num2);
   printf("\n Press 1 to enter another operation.");
   scanf("%d",&dec);
   if(dec==1)
   {
      goto Start;
   }
   return 0;
}


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

Как я уже сказал, я уже пробовал функцию modf.

Richard MacCutchan

Когда вы получаете ошибку, действительно имеет смысл точно объяснить, что это за ошибка.

KarstenK

Выведите на экран дополнительную пользовательскую информацию о вводе и операторе.

Я бы использовал "пространство" для другой операции ;-)

2 Ответов

Рейтинг:
17

phil.o

То modf функция описана здесь:
Библиотечная функция C - modf() - Tutorialspoint[^]
Второй параметр не является делителем, он должен быть указателем на переменную того же типа, что и первый аргумент.
Другой способ получить десятичную часть числа-вычесть из нее его целочисленную часть.

double value1 = 4.5;
double value2 = 3;
double dec1 = value1 - floor(value1);
double dec2 = value2 - floor(value2);
assert(dec1 != 0);
assert(dec2 == 0);

Но ваша проблема может быть так же проста, как форматирование значения (нет необходимости делать какие-либо предварительные вычисления вообще). Может быть Синтаксис спецификации формата: функции printf и wprintf | Microsoft Docs[^- тогда я могу тебе помочь.


k5054

Ссылка, размещенная здесь, предназначена для форматирования C++, в то время как программа находится на языке C и использует printf(). Google может помочь найти учебник, если он нужен оператору.

phil.o

Хорошая точка. Я обновил ссылки.
Спасибо.

Рейтинг:
12

CPallini

Попробуй

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

int good_operator(char op);
double operation(double num1 ,char op, double num2);

int main()
{
  const double EPSILON = 0.001;

  printf("Welcome to Basic Calculator---Made by Cevik Cukurova\n");

  int cont;

  do
  {

    double num1,num2, result, intpart;
    char op;
    printf("Please enter the operation.\n ");
    scanf("%lf",&num1);
    scanf("%c",&op);
    scanf("%lf",&num2);
    if ( ! good_operator(op) )
    {
      printf("Error! Something wrong about operator.\n");
    }
    else
    {
      result = operation(num1, op, num2);
      printf("result = ");
      if ( modf(result, &intpart) > EPSILON )
      {
        printf("%g\n", result);
      }
      else
      {
        printf("%d\n", (int)intpart);
      }
    }
    printf("\n Press 1 to enter another operation.\n");
    scanf("%d",&cont);
  } while (cont ==1);

  return 0;
}

int good_operator(char op)
{
  return (op == '+' || op == '-' || op == '*' || op == '/');
}

double operation(double num1 ,char op, double num2)
{
  double result;

  if (op == '+')
  {
    result = num1+num2;
  }
  else if (op == '-')
  {
    result = num1-num2;
  }
  else if (op == '*')
  {
    result = num1*num2;
  }
  else if( op =='/')
  {
    result = num1/num2;
  }
  else
  {
    assert(0);
  }
  return result;
}


Jaqross

Спасибо,это хорошо работает...Но я никак не мог понять что такое Эпсилон :)

CPallini

Это небольшое (произвольное, по вашему выбору) значение, используемое для сравнения двойников "здравым смыслом", то есть если

(a - b) > EPSILON

затем a это (примерно) равно b (то есть между этими двумя числами есть небольшая разница).
Смотрите, например:
https://floating-point-gui.de/errors/comparison/