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

Вещественное к рациональному

24.06.2013, 19:10. Показов 647. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть простенькая программа, которая берет вещественное число от 0,001 до 0,999 и выдает числитель и знаменатель рационального числа.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
struct drob
{
  unsigned int chislitel;
  unsigned int znamenatel;
};
short N_array( double real_number, short int accuracy, double *arrayni)
{
  double Ri;
  double Ni;
  short int index;
  double i;
  Ri = real_number;
  index = 0;
  while(index<accuracy*4)
    {
     Ni = 1/Ri;
     if (Ni > INT_MAX) {index--; break;}
     i = floor(Ni);
     arrayni[index] = i;
     Ri = Ni-i;
     if (Ri == 0.0)
       break;
    index++;
    }
  return index;
}
struct drob Ns_Ds( double real_number, short int accuracy)
{
  struct drob Drib;
  unsigned  int Ns;
  unsigned  int Ds;
  unsigned  int N;
  unsigned  int D;
  short int index;
  short int position;
  double array_ni [accuracy*4];
  position = N_array(real_number,accuracy,array_ni);
  Ns = 1;
  Ds = array_ni[position];
  index = position-1;
  while (index != -1)
    {
      N = Ds;
      D = Ds*array_ni[index] + Ns;
      Ns = N;
      Ds = D;
      index--;
    }
  Drib.chislitel = Ns;
  Drib.znamenatel = Ds;
  return Drib;
}
 
int main(void)
{
  struct drob drib1;
  double real1;
  double i;
  printf("Старт\n");
  i = 0.820; /*Вот оно стартовое значение цикла */
  while (i<0.823)
  {
      drib1 = Ns_Ds(i,3);
      printf("%f",i);
      printf(" = %u", drib1.chislitel);
      printf(" %u \n",drib1.znamenatel);
      i = i+0.001;
      drib1.chislitel = 0;
      drib1.znamenatel = 0;
  }
  return 0;
}
В функции main есть цикл перебора вещественных чисел, если начать его с 0,820, то числитель и знаменатель для 0,822 вычисляются правильно, а если с 0,800 то вылетают бредовые цифры. Не пойму в чем проблема
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2013, 19:10
Ответы с готовыми решениями:

Преобразовать дробь к дробно-рациональному виду
Здравствуйте. Нужно преобразовать дробь к дробно-рациональному виду. Исходная дробь...

Пользователь вводит с клавиатуры: начальную сумму, внесённую на депозит (вещественное положительное число), годовой процент (вещественное положительно
Пользователь вводит с клавиатуры: начальную сумму, внесённую на депозит (вещественное положительное...

Вещественное деление на 0
program z1; var x,f:real; begin x:=0; while x&lt;=1 do begin...

Вещественное переполнение
const e=0.001; var y:array of real; a,b,h:real; n:integer; function F(x:real):real; ...

1
7yber
25.06.2013, 20:54 2
Проблема решена, заодно познакомился и с выполнением сишных программ под Линухом. Оказывается, нельзя в циклах в качестве счетчика использовать вещественные числа, и передавать их в цикле как параметр функции. Будет передаваться неверное значение. Переделал цикл перебора с использованием вкачестве счетчика целого числа, а передаю в функцию вещественное, как результат деления счетчика на 1000. Теперь нет ни одной ошибки в расчетах
25.06.2013, 20:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 20:54
Помогаю со студенческими работами здесь

Вещественное число
Дано вещественное число X (|X| &lt; 1) и целое число N (&gt; 0). Вывести X – X2/2 + X3/3 – ... +...

Вещественное число
По заданию : &quot;Дано вещественное число А&gt;0. Найти среди чисел 1, 1+1/2, 1+1/2+1/3, ...первое число...

Вещественное число
Имеется следующая лемма и соответсвующее доказательство: Для любых двух различных вещественных...

Вещественное деление
Думаю вопрос озвучивать не стоит... Раньше с такой ошибкой не сталкивался...


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

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