Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Системы счисления, Перевод из десятичной СИ в любую 
:(
    Опции темы
slnes
Дата 15.8.2005, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 24.6.2005

Репутация: нет
Всего: нет



Как перевести ДЕЙСТВИТЕЛЬНОЕ число из десятичной системы счисления в любую (больше двоичной)? Прошу привести принцип перевода, желательно код на C++.
PM MAIL   Вверх
_hunter
Дата 15.8.2005, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



http://www.nntu.sci-nnov.ru/DISLRN/sysschisl.htm
если там нет о действительных числах -- в алгоритмах я писал как переводить в двоичную систему а из нее легко можно перевести в любую другую


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mayk
Дата 15.8.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



По-моему это уже недавно обсуждалось, ну да ладно:
пусть
double X - число, которое надо перевести
const int N - основание системы счисления
string out - число в нужной системе

1) Переводим целую часть. Для этого делим пока не надоест на N, остаток деления добавляем к началу out, если результат деления < N, то нам надоаедает делить, и мы больше не делим(добавляем результат от деления).

Код

       double x;
        const int N=7;
        char* alphabet = "0123456789abcdefghijklmnopqrstuvxyz";

        x=12.34;
        int xint = int(x);
        div_t d;
        string out;

        //////////////////////////////////
        do{
                d=div(xint, N);
                xint = d.quot;
                out = alphabet[d.rem] + out;
        }while(xint >= N);
        out = alphabet[d.quot] + out;
        printf("out=%s\n",out.c_str());


2) Дробная часть.
2.1) Делаем X=X - |_X_|, то есть оставляем дробную часть.
2.2) Домножаем на N, пока не надоест. После домножения на N целую часть записываем в конец out и откидываем. Потом смотрим - если дробная часть = 0, то всё. Перевод закончен. Если нет, и такая дробная часть уже была, то значит получается периодичная дробь.
Для простоты реализации сделаем максимальную точность в M знаков.
Код

        const int M=8; int m = M;
        out += '.';
        while(x > 0.0 && m--){
                x = x-floor(x); //x = x - |_x_|
                x = x * N;
                xint = int(floor(x));
                out += alphabet[xint];
                x = x - xint;
        }
        printf("out=%s\n",out.c_str());

Вот что-то типа того.

Это сообщение отредактировал(а) Mayk - 15.8.2005, 15:02


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
slnes
Дата 16.8.2005, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 24.6.2005

Репутация: нет
Всего: нет



Что значит запись int( чего нибудь)?
PM MAIL   Вверх
Mayk
Дата 16.8.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(slnes @ 16.8.2005, 12:10)
Что значит запись int( чего нибудь

В C++ так можно преобразовывать float в int(ну и наоборот). То есть если в C следовало бы писать
Код

int a=(int)cos(alpha)*20;

то в С++ можно использовать "конструктор" для int:
Код

int a=int(cos(alpha)*20);

Вторая форма мне нравится больше, так как в ней меньше писать.В данном случае это надо, чтобы избавится от wargning'ов компиялтора о том, что int'у присваивается float значение. Но это всё же не совсем конструктор - int a(cos(2.0f)*2); ругается по прежнему smile
PS. вообще тут по хорошеу следует использовать static_cast<int>(чего-то там) - преобразование чего-то там к инту. Но это уже имхо перебор. ИМХО такой код очень трудно читается, а то, что он легче поддаётся grep'ированию - достоинство весьма сомнительное(ну зачем оно мне сдалось?).


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Hroft
Дата 16.8.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Цитата(Mayk @ 16.8.2005, 09:14)
int a(cos(2.0f)*2)

А он точно ругается на приведение типа, а не на неправильную попытку объявления функции? smile

Цитата(Mayk @ 16.8.2005, 09:14)
static_cast<int>

Я обычно куда-нибудь в библиотечный файлик во всех проектах функцию типа round вставляю, в которой делаю этот самый статик_каст.
PM MAIL ICQ   Вверх
Mayk
Дата 16.8.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Hroft @ 16.8.2005, 13:45)
А он точно ругается на приведение типа, а не на неправильную попытку объявления функции?

Точно:
Код

int main(int argc)
{
        int a(cos(M_PI/3)*2); //<--14 строка(инклюды опустил; зачем мне когда-то понадобился argc без argv не помню)
        printf("%d\n",a);
}

Цитата

$ g++ ./a.cpp
a.cpp: In function `int main(int)':
a.cpp:14: warning: initialization to `int' from `float'
a.cpp:14: warning: argument to `int' from `float
$ ./a.out
1

Тут же после скобки не встречается тип. Значит, это не объявление ф-ции, а вызов гхм конструктора. Вот это вот нормально компилируется:
Код

int j=5;
int o(j*5*static_cast<int>(sin(M_PI/2)));

Цитата(Hroft @ 16.8.2005, 13:45)
Я обычно куда-нибудь в библиотечный файлик во всех проектах функцию типа round вставляю, в которой делаю этот самый статик_каст.

А мне, повторюсь, лень писать лишний десяток символов. Вообще из с++ привидений(aka призраков) только dynamic_cast нравится, бо не даёт класс из одной иерархии приводить к классу другой и нуль вернёт, если что не так.

Ух, какой оффтопик однако пошёл.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
slnes
Дата 16.8.2005, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 24.6.2005

Репутация: нет
Всего: нет



Спасибо, переделал под свои нужды, всё работает.

Код

double x;
const int N=2;
char* alphabet = "0123456789abcdef";
x=0.5;
int xint;
char* out="             ";
const int M=5; int m = M;
while(x > 0.0 && m--){
    x = x-floor(x); 
    x = x * N;
    xint = int(floor(x));
    out[M-m] = alphabet[xint];
    x = x - xint;
    }
    cout << out << "\n";

PM MAIL   Вверх
Helicopterr
Дата 20.8.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



// Парни! не переписывайте заново iostream. Там всё ничтяк я проверял!

cout<<hex<<chislo cotoroe nuzno perevesti;

//Результат:
//если число в 10-тичной форме то даст 16-ричную
//если число в 16-ричной форме то даст 10-тичную



--------------------
people can fly
PM MAIL   Вверх
Mayk
Дата 20.8.2005, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Helicopterr @ 21.8.2005, 01:54)
// Парни! не переписывайте заново iostream. Там всё ничтяк я проверял!

Да ну? Проверь вот это:
Код

cout << hex << 16.54 << endl;

bcc55 выводит 16.54. C++ из Visual Studio 2003 выводит 16.54. Что не есть быть правда. К тому же как вывести число в 11ричной системе(я правда не знаю)?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Helicopterr
  Дата 20.8.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 20.8.2005
Где: Stavropol

Репутация: 2
Всего: 3



я даже не знаю как будет выглядеть дробное число (16,54) в 16-ричке...
не в п. напиши.

насчёт основания системы - если потребности нестандартные,
конечно придётся дописывать...

Это сообщение отредактировал(а) Helicopterr - 20.8.2005, 22:30


--------------------
people can fly
PM MAIL   Вверх
Void
Дата 20.8.2005, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Helicopterr @ 21.8.2005, 00:28)
я даже не знаю как будет выглядеть дробное число (16,54) в 16-ричке...
не в п. напиши.

10.8(A3D70)


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.