Форум программистов, компьютерный форум CyberForum.ru

Перевод вещественных из системы в систему, сравнение вещественных - C++

Восстановить пароль Регистрация
 
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
24.05.2011, 10:47     Перевод вещественных из системы в систему, сравнение вещественных #1
Есть задача: задаются в восьмеричной системе число а, число b, число h, нужно отобразить все числа от a до b с шагом h в восьмеричном и двоичном виде. Задача осложняется тем, что число дробное, т.е. вещественное с модулем меньше 1.
а теперь что я сообразил+следы моих извращений:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <math.h>
 
int fractoint(double x)
{
    double r=x;
    int p;
    while (r-(int)r>0.0)
    {
        r*=10;
    }
    p=(int)r;
    return p;
}
 
int octtodec(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%10)*pow(8, (float)k);
        k++;
        n/=10;
    }
    return dec;
}
 
int dectooct(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%8)*pow(10, (float)k);
        k++;
        n/=8;
    }
    return dec;
}
 
int dectobin(int x)
{
    int dec=0, k=0, n=x;
    while (n!=0)
    {
        dec+=(n%2)*pow(10, (float)k);
        k++;
        n/=2;
    }
    return dec;
}
 
int zeroscount(double x)
{
    int n=0;
    float z=x;
    bool digenc=true;
    while (digenc)
    {
        z*=10;
        if ((int)z==0)
        {
            n++;
        }
        if((int)z!=0)
        {
            digenc=false;
        }
    }
    return n;
}
 
void main()
{
    float a, b, h, xd, ad, bd, hd;
    cout<<"a = ";
    cin>>a;
    if (abs(a)>=1) {cout<<"slishkom bolshoe chislo"; return;}
    cout<<"b = ";
    cin>>b;
    if (abs(b)>=1) {cout<<"slishkom bolshoe chislo"; return;}
    cout<<"shag h = ";
    cin>>h;
    if (abs(h)>=1) {cout<<"slishkom bolshoe chislo"; return;}
 
    char strnda[12]="0.", strndb[12]="0.", strndh[12]="0.", strnpd[10];
    int xdd, hdd, bdd;
    for (int i=0; i<zeroscount(a); i++) strcat(strnda, "0");
    for (int i=0; i<zeroscount(b); i++) strcat(strndb, "0");
    for (int i=0; i<zeroscount(h); i++) strcat(strndh, "0");
    strcat(strnda, itoa(octtodec(fractoint(a)), strnpd, 10));
    strcat(strndb, itoa(octtodec(fractoint(b)), strnpd, 10));
    strcat(strndh, itoa(octtodec(fractoint(h)), strnpd, 10));
    ad=atof(strnda);
    bd=atof(strndb);
    hd=atof(strndh);
    xd=ad;
 
 
    int n=0;
 
    while (xd<bd)
    {
        cout<<n<<endl;
        char strng[12]="0.", strnb[32]="0.", strnp[30];
        for (int i=0; i<zeroscount(xd); i++) {strcat(strng, "0"); strcat(strnb,"0");};
        strcat(strng, itoa(dectooct(fractoint(xd)), strnp, 10));
        cout<<strng<<endl;
        strcat(strnb, itoa(dectobin(fractoint(xd)), strnp, 10));
        cout<<strnb<<endl;
        n++;
        xd+=hd;
    }
 
    cin.get();
    cin.get();
}
где fractoint извлекает из числа дробную часть в инт (причем r-(int)r - слабое место программы вообще, часто падает), три функции переводят числа из системы в систему, zeroscount считает количество нулей между точкой и числом отличным от нуля, потому что при выводе дробного хвоста в инт нули спереди теряются.
Дальше, собственно, сама программа:
Ввожу a, b, h, перевожу их в десятичный вид через строки (так компактнее показалось и нули не теряю), получаю соответственно ad, bd, hd, xd. Десятичный вид мне нужен чтобы правильно шаг считать.
А вот дальше - затык. Естественно такое сравнение вещественных ничего не дает, в цикл, соответственно, не заходит. Пытался преобразовать ad, bd, hd, xd в целые (извлечь дробную часть, в смысле), но тут прога ломается на fractoint. В общем что делать чтобы оно хотя бы заработало и хотя бы приблизительно считало?
Пишу под 2009 билдер.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 10:47     Перевод вещественных из системы в систему, сравнение вещественных
Посмотрите здесь:

Перевод из системы по основанию 10 в систему по основанию 8 C++
[C++] перевод числа из 10-ой системы счислени в систему счисления от 2 до 9 C++
C++ Перевод чисел из системы остаточных классов в десятичную систему счисления
Перевод вещественных чисел в двоичные C++
C++ Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.05.2011, 11:20     Перевод вещественных из системы в систему, сравнение вещественных #2
Дробная часть тоже переводится, только наоборот. При переводе целой части надо делить и за цифру берётся остаток. А при переводе дробной чати надо умножать и за цифру берётся целая часть произведения. И целая часть переводится справа на лево, а дробная слева направо. А вот зачем это надо - тот ещё вопрос.
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
24.05.2011, 11:35  [ТС]     Перевод вещественных из системы в систему, сравнение вещественных #3
Цитата Сообщение от taras atavin Посмотреть сообщение
Дробная часть тоже переводится, только наоборот. При переводе целой части надо делить и за цифру берётся остаток. А при переводе дробной чати надо умножать и за цифру берётся целая часть произведения. И целая часть переводится справа на лево, а дробная слева направо. А вот зачем это надо - тот ещё вопрос.
На перевод плевать, пущай работает как работает, принципиальный вопрос - запустить цикл и сделать так чтобы он дошел до конца выдавая корректные промежуточные значения. Самое большое чего я мог добиться - подбирал такие значения а, б и х, чтобы цикл запускался, но прога выпадала с ошибкой и результаты далеки от правильных были.
А зачем надо - не знаю и сам. Так поставлена задача. С целыми значениями-то там работы на две минуты.
Если вы имеете ввиду что можно было не переводя в целые значения считать, то тут всё равно не обошлось бы без съема у вещественного целой части в цикле, а как показала практика - прямое r-(int)r к ошибкам неустойчиво. Да и в строку стандартными методами можно только инт перевести, если я не ошибаюсь.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.05.2011, 11:39     Перевод вещественных из системы в систему, сравнение вещественных #4
Цитата Сообщение от ZaLiZo Посмотреть сообщение
Да и в строку стандартными методами можно только инт перевести, если я не ошибаюсь.
C++
1
std::cout<<a;
работает со всеми встроенными типами без исключений и со всеми классами, для каких опеределишь оператор, а
C++
1
FloatToStr
вообще предназначен только для вещественных.
ZaLiZo
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 3
24.05.2011, 11:58  [ТС]     Перевод вещественных из системы в систему, сравнение вещественных #5
Цитата Сообщение от taras atavin Посмотреть сообщение
C++
1
std::cout<<a;
работает со всеми встроенными типами без исключений и со всеми классами, для каких опеределишь оператор, а
C++
1
FloatToStr
вообще предназначен только для вещественных.
Это всё, конечно, чудесно, но что мне с циклом-то делать?
Yandex
Объявления
24.05.2011, 11:58     Перевод вещественных из системы в систему, сравнение вещественных
Ответ Создать тему
Опции темы

Текущее время: 00:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru