Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 16
1

Число с плавающей точкой

24.10.2019, 21:07. Показов 7745. Ответов 6

Author24 — интернет-сервис помощи студентам
Прошу помогите, только начинаю учиться и есть затыки в работе с си. Есть программа которая выбирает вариант решения в зависимости от условий. Проблема в том, что когда вводишь в Y значение 4.0000...01 выводится число с погрешностью. Можно ли как то избежать данной погрешности или же как-то ограничить возможность вводить такие вещественные числа, где после точки больше 3 нулей. Приношу извинения за свою неграмотность !
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  double x,y,s;
  printf ("Input x\n");
  scanf("%lf",&x);
  printf ("Input y\n");
  scanf("%lf",&y);
  
  s=((y!=4&&-y<x<=y)? (x-2)/(y-4):(x!=0&&y<x)? y/x : y*x);
  printf("S=%lf\n",s);
  return 0;
}
Миниатюры
Число с плавающей точкой  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2019, 21:07
Ответы с готовыми решениями:

Преобразовать число с плавающей точкой в строку
Здравствуйте! Как преобразовать число с плавающей точкой в строку(чтобы в строке присутствовала...

Получить точное число с плавающей точкой
Доброго времени суток! Подскажите, как получить точное число при делении? Делаю так: ...

Вернуть указатель на число с плавающей точкой
//такой работает double *FindInProc(int *x,int *max) { double i =...

Вывести число с плавающей точкой в разных представлениях
Изучаю язык(начал изучать с Си), всё очень нравится, вот только понимаю, что без помощи не обойтись...

6
Злостный нарушитель
9494 / 5141 / 1172
Регистрация: 12.03.2015
Сообщений: 24,225
24.10.2019, 22:51 2
Цитата Сообщение от rokajero Посмотреть сообщение
Можно ли как то избежать данной погрешности
Нет, нельзя.
Цитата Сообщение от rokajero Посмотреть сообщение
как-то ограничить возможность вводить такие вещественные числа
Мож просто округлять ВЫВОДИМЫЙ результат до нужной цифры после точки, а?
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 16
24.10.2019, 23:50  [ТС] 3
Дело в том, что если например ввести значение для y=4.00000000001, то программа выведет значение -99999991725.963577, что в принципе почти верный ответ, но с погрешностью. Поэтому и спрашиваю можно ли как то избавиться от этой погрешности или просто не дать пользователю вводить числа на подобие 4.00000000001 ?
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
25.10.2019, 00:04 4
Цитата Сообщение от rokajero Посмотреть сообщение
Можно ли как то избежать данной погрешности или же как-то ограничить возможность вводить такие вещественные числа, где после точки больше 3 нулей.
Единственный вариант -- считать в буффер строку и преобразовать ее в вещественное число с необходимой вам точностью. Хорошая практика парсинга.
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 16
25.10.2019, 00:17  [ТС] 5
Простите, я еще слишком слабо разбираюсь во всем этом, поэтому не все понимаю. Но вроде тщетными попытками я нашел способ ограничить пользователя от ввода таких чисел. По идее, теперь пользователь, если захочет ввести такое число просто получит предупреждение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define EPS 1e5
 
 
int main()
{
  double x,y,s;
  printf ("Input x\n");
  scanf("%lf",&x);
  printf ("Input y\n");
  scanf("%lf",&y);
  s=((y!=4&&-y<x<=y)? (x-2)/(y-4):(x!=0&&y<x)? y/x : y*x);
 
  if (fabs(s) > EPS)
  {
      printf("Warning\n");
  }
  else {
    printf("S=%lf\n",s);
  }
  return 0;
}
0
Злостный нарушитель
9494 / 5141 / 1172
Регистрация: 12.03.2015
Сообщений: 24,225
25.10.2019, 08:16 6
Цитата Сообщение от rokajero Посмотреть сообщение
Но вроде тщетными попытками я нашел способ ограничить пользователя от ввода таких чисел. По идее, теперь пользователь, если захочет ввести такое число просто получит предупреждение
Это называется "костыль". От такого программирования порой падают самолёты, тонут корабли и спутники, гибнут люди.
Не делай так.
0
200 / 236 / 33
Регистрация: 29.03.2019
Сообщений: 667
25.10.2019, 14:56 7
Цитата Сообщение от rokajero Посмотреть сообщение
поэтому не все понимаю
Я говорю о разборе строки, содержащей вещественное число. То есть вы считываете не сразу число из потока, а строку, дальше обрабатываете строку и получаете из нее число с необходимой вам точностью:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
double
match_double (unsigned char * ptr, double eps) {
  int integer = 0;
  int fractional = 0;
  int counter = 1;
  unsigned char ch;
 
  while (*ptr && isdigit(*ptr)) {
    integer = integer * 10 + *ptr - '0';
    ptr++;
  }
  if (*ptr == '.') {
    ptr++;
    while (*ptr && isdigit(*ptr) && (eps < 1.0)) {
      eps *= 10;
      counter *= 10;
      fractional = fractional * 10 + *ptr - '0';
      ptr++;
    }
  }
  return (double) integer + (double) fractional / (double) counter;
}
 
int
main(int argc, char ** argv)
{
  double n = match_double("1234.112233", 0.001);
  fprintf(stdout, "%lf\n", n);
  return 0;
}
Добавлено через 1 минуту
Bash
1
2
3
bash-4.4-$ ./a.out 
1234.112000
bash-4.4-$
0
25.10.2019, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2019, 14:56
Помогаю со студенческими работами здесь

Вывести число с плавающей точкой без лишних нулей
Уважаемые, форумчане! Столкнулась с такой проблемой. Необходимо вывести число с плавающей точкой...

Программа, вычисляющая по формуле число с плавающей точкой с заданной точностью
Доброго времени суток. Пишу программу, которая по формуле ососбой выисляетя число с особой...

Дано число с плавающей точкой - вывести его, округлив до тысячных
что то не пойму что это значит, и как реализовать

Вещественное число с плавающей точкой записать в переменную типа float
в строке записано вещественное число с плавающей точкой. записать это число в переменную типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru