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

Перевод дробной части из десятичной в восьмиричную (маленький фрагмент)

05.04.2020, 13:35. Показов 1522. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо перевести число из восьмеричной в десятичную систему счисления, а именно дробную часть.
Попытаюсь объяснить сам алгоритм на примере:

1)У нас есть число 0.94, которое мы умножаем на восемь. Получаем 7.52 (0.94 * 8 = 7.52)

2)Теперь нужно умножить дробную часть полученного числа на 8 (0.52 * 8 = 4.16) и так далее

3) Повторяем умножение до тех пор, пока последняя дробная часть не обратится в ноль.

4) Целая часть у нас равна нулю, а цифры в дробной части (слева на право) это есть целые части наших произведений (сверху вниз). То есть, в самом младшем разряде оказывается целая часть последнего произведения. Т.е. 0.94 = 0.74 (берутся целые числа деления!)



Заранее спасибо за помочь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2020, 13:35
Ответы с готовыми решениями:

Перевод десятичной дроби в восьмиричную
Составить программу в паскале для перевода десятичной дроби в восьмеричную.Вроде ясно как делать,но...

Перевод дробной части числа из десятичной системы счисления в любую другую систему счисления
Здравствуйте как перевести дробной части числа из десятичной системы счисления в любую другую...

Перевод числа N из десятичной системы счисления в восьмиричную
Здравствуйте! Я начинающий программист и мне очень надо создать 3 программы на С++ а мой запас...

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

10
Заблокирован
05.04.2020, 14:45 2
Цитата Сообщение от Jeffrey Rout Посмотреть сообщение
Необходимо перевести число из восьмеричной в десятичную систему счисления
Цитата Сообщение от Jeffrey Rout Посмотреть сообщение
1)У нас есть число 0.94
В восьмеричной системе нет цифры 9. И 8 - тоже.
Напиши пример входных и выходных данных.
0
Заблокирован
05.04.2020, 14:50 3
Перевод дробной части из десятичной в восьмиричную (маленький фрагмент)
0
0 / 0 / 0
Регистрация: 05.04.2020
Сообщений: 5
05.04.2020, 14:51  [ТС] 4
Простите, я случайно ошибся. Нужно перевести ИЗ ДЕСЯТИЧНОЙ В ВОСЬМЕРИЧНУЮ.
0
Заблокирован
05.04.2020, 15:03 5
Цитата Сообщение от Jeffrey Rout Посмотреть сообщение
Простите, я случайно ошибся

Я тебя прощаю.
0
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
05.04.2020, 15:40 6
Подключите библиотеку cmath
C++
1
#include <cmath>
и воспользуйтесь функцией std::modf

C++
1
2
3
double number, whole, fraction;
number = 12.77;
fraction = std::modf(number, &whole); // number == number, fraction - дробная часть (0.77), whole - целая часть (12.0)
0
0 / 0 / 0
Регистрация: 05.04.2020
Сообщений: 5
05.04.2020, 16:30  [ТС] 7
Annemesski, спасибо, но это не то. Это я и так сделал.
0
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
05.04.2020, 17:24 8
Jeffrey Rout, и? То что Вы описали выглядит так:
C++
1
2
3
4
5
6
7
double oct_translate(double dec)
{
    double eps = 1e-6, f, res = 0.0;
    int i = 1;
    while ((dec = modf(dec, &f)) > eps)
        res += f / (i++ * 10);
}
но это чушь, с Вашим примером такой цикл никогда не закончится. Может все таки нужно перевести дробную часть числа в восьмеричную систему счисления верным способом, ака: на первой итерации делить с остатком исходное число на основание системы, далее делить на основание системы частное пока промежуточное частное не станет меньше основания системы счисления, после чего начиная с последнего частного переписывать в результат поразрядно полученные остатки от делений?
0
0 / 0 / 0
Регистрация: 05.04.2020
Сообщений: 5
05.04.2020, 17:29  [ТС] 9
Annemesski, Спасибо, уже не надо. И это тоже не то.
0
Заблокирован
05.04.2020, 18:30 10
Лучший ответ Сообщение было отмечено Jeffrey Rout как решение

Решение

Перевод дробной части из десятичной в восьмиричную (маленький фрагмент)

Кликните здесь для просмотра всего текста

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
77
// обрезка нулей слева и справа
char* trim_zeroes(char* src)
{
  // обрезка справа
  char* ptr = src + strlen(src) - 1;
  while (ptr > src && *ptr == '0') *ptr-- = 0;
 
  // обрезка слева
  ptr = src;
  while (*ptr == '0' && *(ptr + 1) != '.') ptr++;
 
  if (!*ptr) strcpy(src, "0");
  else strcpy(src, ptr);
 
  return src;
}
 
// разделение строки на 2 части по первой точке.
// Если точки нет, то вернёт left = src, right будет пустой строкой.
char* point_split(char* src, char* left, char* right)
{
  char* dot_pos = strchr(src, '.');
  
  if (!dot_pos) // точки нет
  {
    strcpy(left, src);
    *right = 0;
  }
  else // точка есть
  {
    strncpy(left, src, (dot_pos - src) / sizeof(char));
    strcpy(right, dot_pos + 1);
  }
  
  left[strlen(left)] = 0; // особенность strncpy()
  return left;
}
 
// перевод десятичного числа с фиксированной точкой в восьмеричную СС
// Пример для отладки 132.267(10) ----->204.2105(8)
bool try_dec2oct(char* src, char* dest)
{
  if (!is_dec_str(src)) return false; // неверный ввод
 
  char value[128], frac[128]; // буфера
  point_split(src, value, frac); // разделение
 
  uint64_t int_part = 0; // целая часть
  sscanf(value, "%I64u", &int_part);
  sprintf(dest, "%I64o", int_part);
  
  // дробная часть    
  unsigned frac_len = strlen(frac); 
  
  if (frac_len) // есть дробная часть
  {
    double frac_part; // дробная часть (с погрешностью)
    
    strcpy(value, "0.");
    strcat(value, frac);
    sscanf(value, "%lf", &frac_part);
   
    strcat(dest, ".");
    char* dptr = dest + strlen(dest);
    frac_len++; // корректировка кол-ва восьмеричных разрядов   
      
    while (frac_len--)
    {
      int_part = (unsigned)(8 * frac_part);
      *dptr++ = (char)(0x30 + int_part);
      frac_part = (8 * frac_part) - int_part;
    }
  }
   
  trim_zeroes(dest); 
  return true;
}


Цитата Сообщение от Jeffrey Rout Посмотреть сообщение
Повторяем умножение до тех пор, пока последняя дробная часть не обратится в ноль.
В общем случае дробь может быть бесконечной. Именно поэтому дробные числа переводятся с погрешностью.
Я в своём говнокоде ограничил кол-во выходных восмеричных разрядов дробной части количеством входных десятичных разрядов дробной части плюс 1, ибо на входе я интерпретирую строку как десятичное с фиксированной точкой.
1
0 / 0 / 0
Регистрация: 05.04.2020
Сообщений: 5
05.04.2020, 18:39  [ТС] 11
СПАСИБО ТЕБЕ ОГРОМНОЕ за то, что потратил на меня время. Я недавно закончил с этой задачкой, но я правда очень сильно рад, что кто-то потратил на меня время. Ещё раз спасибо. Здоровья и успехов тебе.
0
05.04.2020, 18:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2020, 18:39
Помогаю со студенческими работами здесь

Перевод чисел из ДЕСЯТИЧНОЙ системы счисления в ВОСЬМИРИЧНУЮ и ДВОИЧНУЮ
&quot;перевод чисел из ДЕСЯТИЧНОЙ системы счисления в ВОСЬМИРИЧНУЮ и ДВОИЧНУЮ&quot; Вот такую бяку задали в...

Рекурсия.Перевод с десятичной в двоичную, восьмиричную и шестнадцатиричную системы
Нужно перевести с десятичной в эти 3 системы,но с рекурсией у меня не выходит. Как его сделать?Я в...

Перевод чисел в десятичную систему счисления, из десятичной в восьмиричную
Народ,у кого есть программы на VB.Net для работы со системами счисления? Перевод в десятичную,из...

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


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

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