перевод чисел
От: E.Elena  
Дата: 23.10.06 16:19
Оценка:
Добрый вечер!
Помогите советом, не могу до конца понять перевод и представление числа в 16 с/с.
Например, мне задано число
0.231 E+5 (записано именно так)
Я понимаю, как переводить дробную часть числа, т.е. 0.231...
Вопросы в следующем:
1) "E" в 16-ой с/с тоже самое что и в 10-ой, т.е (например, 0.02 Е+6 = 0.02*pow(10,6)) или для 16-ой с/с "E" есть 16?
2) как переводить это "E+5" из 16 с/с в 10-ю?
представить как: например, если E=10; E+5=100000 и переводить? или это можно сделать как-то по другому?
Re: перевод чисел
От: Erlond Россия  
Дата: 23.10.06 16:49
Оценка:
Здравствуйте, E.Elena, Вы писали:

EE>Добрый вечер!

EE>Помогите советом, не могу до конца понять перевод и представление числа в 16 с/с.
EE>Например, мне задано число
EE>0.231 E+5 (записано именно так)
EE>Я понимаю, как переводить дробную часть числа, т.е. 0.231...
EE>Вопросы в следующем:
EE>1) "E" в 16-ой с/с тоже самое что и в 10-ой, т.е (например, 0.02 Е+6 = 0.02*pow(10,6)) или для 16-ой с/с "E" есть 16?
EE>2) как переводить это "E+5" из 16 с/с в 10-ю?
EE> представить как: например, если E=10; E+5=100000 и переводить? или это можно сделать как-то по другому?

0.231 E +5 = 0.231 * 10^5 = 0.231 * 100000 = 23100 (Это всё в 10-чной системе счисления)
в данной записи E+5 — это 10 в пятой степени, таким образом вам нужно перевести число 23100 в шестнадцатеричную систему.

#include <iostream>
#include <stdlib.h>

 int main ()
 {
     int num = 0.231e+5;
     char str[12];

     _itoa_s(num, str, 12, 16 );
     cout << str;
 
     return 0;
 }
Re[2]: перевод чисел
От: E.Elena  
Дата: 23.10.06 17:51
Оценка: :)))
Здравствуйте, Erlond, Вы писали:

E>#include <iostream>
E>#include <stdlib.h>

E> int main ()
E> {
E>     int num = 0.231e+5;
E>     char str[12];

E>     _itoa_s(num, str, 12, 16 );
E>     cout << str;
 
E>     return 0;
E> }



a что делать если число 0.231Е-5, меньше нуля?
Re: перевод чисел
От: night beast СССР  
Дата: 23.10.06 18:18
Оценка:
Здравствуйте, E.Elena, Вы писали:

EE>Добрый вечер!

EE>Помогите советом, не могу до конца понять перевод и представление числа в 16 с/с.
EE>Например, мне задано число
EE>0.231 E+5 (записано именно так)
EE>Я понимаю, как переводить дробную часть числа, т.е. 0.231...
EE>Вопросы в следующем:
EE>1) "E" в 16-ой с/с тоже самое что и в 10-ой, т.е (например, 0.02 Е+6 = 0.02*pow(10,6)) или для 16-ой с/с "E" есть 16?
EE>2) как переводить это "E+5" из 16 с/с в 10-ю?
EE> представить как: например, если E=10; E+5=100000 и переводить? или это можно сделать как-то по другому?

http://groups.google.ru/group/fido7.ru.algorithms/browse_thread/thread/48c3a785e557a5c0
Re[3]: перевод чисел
От: LaptevVV Россия  
Дата: 24.10.06 07:02
Оценка:
Здравствуйте, E.Elena, Вы писали:

EE>a что делать если число 0.231Е-5, меньше нуля?

Абсолютно то же самое...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: перевод чисел
От: Erlond Россия  
Дата: 24.10.06 07:54
Оценка: 1 (1)
Здравствуйте, E.Elena, Вы писали:

EE>Добрый вечер!

EE>Помогите советом, не могу до конца понять перевод и представление числа в 16 с/с.
EE>Например, мне задано число
EE>0.231 E+5 (записано именно так)
EE>Я понимаю, как переводить дробную часть числа, т.е. 0.231...
EE>Вопросы в следующем:
EE>1) "E" в 16-ой с/с тоже самое что и в 10-ой, т.е (например, 0.02 Е+6 = 0.02*pow(10,6)) или для 16-ой с/с "E" есть 16?
EE>2) как переводить это "E+5" из 16 с/с в 10-ю?
EE> представить как: например, если E=10; E+5=100000 и переводить? или это можно сделать как-то по другому?

По хорошему, нужно из числа выделить целую и дробную часть (только не считайте в числе 0.231E+5 дробной частью 0.231). Дальше эти части переводятся по разным правилам
целая часть — делением на основание с/с, а дробная умножением на основание с/с.

Пример: дано число 793.56, требуется перевести в 16-тиричную систему счисления

целая часть — 793
дробная — 0.56

переводим целую часть:

793/16 = 49 и остаток 9, 49 > 16, значит делим дальше
49/16 = 3 и остаток 1

Деление в столбик выглядит нагляднее:

793|16
784|~~~~
~~~~ 49|
  9  48|~~~~~ 
     ~~  3
      1

<------- записываем справа на лево, сначала последний результат, потом все остатки, получаем 319

Послучается, что число 793 в десятичной с/с будет 319 в шестнадцатеричной с/с.(Можете проверить на кальулятторе)

переводим дробную часть: (здесь погрешность неизбежна, переводим с нужной нам точностью, например 4 знака после запятой)

0.56 * 16 = 8.96 (отбрасываем целую часть, это наш разряд, и дальше умножаем 0.96)
0.96 * 16 = 15.36 (отбрасываем 15 (это А) и умножаем 0.36)
0.36 * 16 = 5.76
0.76 * 16 = 12.16

Дробная часть равна 0.8A5С

Получаем число 319.8A5C

То же самое справедливо для любой системы счисления, ну а дальше алгоритм за вами
Re[2]: перевод чисел
От: Ovl Россия  
Дата: 24.10.06 11:16
Оценка:
E>То же самое справедливо для любой системы счисления

справедливо для любой системы счисления с положительным основанием
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[3]: перевод чисел
От: Erlond Россия  
Дата: 24.10.06 11:38
Оценка:
Здравствуйте, Ovl, Вы писали:

E>>То же самое справедливо для любой системы счисления


Ovl>справедливо для любой системы счисления с положительным основанием


Первый раз слышу о системах счистление с отрицательным основанием, если не трудно, расскажите пожалуйста поподробнее.
Re[4]: перевод чисел
От: Ovl Россия  
Дата: 24.10.06 11:49
Оценка:
E>Первый раз слышу о системах счистление с отрицательным основанием, если не трудно, расскажите пожалуйста поподробнее.

кое что можно прочитать здесь, остальное — гугл. специальным поиском я не занимался, просто пришлось как-то заниматься арифметикой с -2
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[5]: перевод чисел
От: Erlond Россия  
Дата: 24.10.06 12:01
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>кое что можно прочитать здесь, остальное — гугл. специальным поиском я не занимался, просто пришлось как-то заниматься арифметикой с -2


Спасибо большое за информацию
Re: перевод чисел
От: Кодт Россия  
Дата: 24.10.06 12:41
Оценка:
Здравствуйте, E.Elena, Вы писали:

Лирическое вступление

Вещественное число f = m*b^p где m — мантисса, b — основание, p — порядок.

Компьютер имеет дело с двоичной арифметикой, поэтому мантисса — нормализованная двоичная дробь, а основание равно 2.

Шестнадцатеричные и десятичные форматы — не естественны для компьютера. Единственное удобство 16-ричного — в том, что перевод из него в двоичный сводится к умножению порядка на 4 и нормализации мантиссы (сдвигу её на 0..3 разряда, с соответствующей коррекцией порядка).

Обрати внимание, что точное преобразование десятичного вещественного числа в двоичное или шестнадцатиричное невозможно: 1/10 это бесконечная двоичная дробь.

Можно ещё изобрести вещественный формат, где мантисса — не дробь, а целое.
Отличается лишь смещением порядка: десятичный пример — 123.4567e+10 = 0.1234567e+13 = 1234567.e+6



Собственно, по теме

Прежде всего определись: тебе надо конвертировать десятичную запись в родной для компьютера формат (IEEE float / double / long double) или в доморощенный?

Простейший способ — это
double parse(int intmantissa, int exponent)
{
    // n = intmantissa * 10^exponent
    // т.е. -123.4567e+10 представлен как -1234567e+6
    return intmantissa * pow(10,exponent);
}

Перевод же в обратную сторону
void compose(double x, int accuracy, int& intmantissa, int& exponent) // abs(intmantissa) < 10^accuracy
{
    int sign = x<-0.0 ? -1 : x>+0.0 ? +1 : 0;
    if(sign==0) { intmantissa=0; exponent=0; return; }
    x = fabs(x);
    
    int p = 1 + int(floor( log(x)/log(10) )); // x = 0.zzzzttttt * 10^p
    
    exponent = p-accuracy; // x = zzzz.ttttt * 10^(p-accuracy)
    intmantissa = sign * int(floor( x/pow(10,exponent) + 0.5 ));
}


Warning: Простейший — не значит лучший.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: перевод чисел
От: vvotan Россия  
Дата: 24.10.06 17:34
Оценка:
Здравствуйте, Erlond, Вы писали:

E>Здравствуйте, Ovl, Вы писали:


E>>>То же самое справедливо для любой системы счисления


Ovl>>справедливо для любой системы счисления с положительным основанием


E>Первый раз слышу о системах счистление с отрицательным основанием, если не трудно, расскажите пожалуйста поподробнее.


Более того, можно построить систему с дробным, иррациональным, комплексным и даже чисто мнимым основанием.
Некоторые из этих систем имеют весьма интересные свойства.Например, в системе счисления по основанию 2i любое комплексное число представимо без знака с помощью всего 4-х цифр.
Достаточно подробно описано у Кнута.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Экспоненциальное представление чисел
От: Пётр Седов Россия  
Дата: 25.10.06 01:37
Оценка:
Здравствуйте, E.Elena, Вы писали:
EE>a что делать если число 0.231Е-5, меньше нуля?
Число 0.231E-5 (= 0.00000231) всегда больше нуля.
Кстати, буква 'E' не русская, а английская и означает 'exponent'. Такая запись называется 'экспоненциальное представление числа' (scientific notation).
Пётр Седов (ушёл с RSDN)
Re: перевод чисел
От: Пётр Седов Россия  
Дата: 25.10.06 02:27
Оценка:
Здравствуйте, E.Elena, Вы писали:

EE>Например, мне задано число 0.231 E+5 (записано именно так)

EE>Я понимаю, как переводить дробную часть числа, т.е. 0.231...
Число 0.231E+5 (= 23100) — целое. Его дробная часть равна нулю.

EE>1) "E" в 16-ой с/с тоже самое что и в 10-ой, т.е (например, 0.02 Е+6 = 0.02*pow(10,6)) или для 16-ой с/с "E" есть 16?

Экспоненциальная нотация (с 'E') используется только для основания 10. Если основание не равно 10, то его пишут явно: d.dd...d * pow(Base, Exp).

EE>... если E=10 ...

Такого не может быть, так как буква 'E' — это не переменная, а часть нотации. Например, как '$' при записи суммы денег (это не переменная 'S').

Если переводить в 16-ричную систему счисления надо только целые числа, то попробуйте такой код:
#include <iostream>
#include <assert.h>

using namespace std;

void PrintNumInHex(int Num)
{
  if (Num < 0)
  {
    Num = -Num;
    cout << '-';
  }
  const int MaxDigs = 8;
  char Digs[MaxDigs];
  int NumDigs = 0;
  do
  {
    assert(NumDigs < MaxDigs); // должно быть место для ещё одной цифры
    Digs[NumDigs++] = "0123456789abcdef"[Num % 16];
    Num /= 16;
  } while (Num != 0);
  // вывести цифры в арабском порядке
  for (int i = NumDigs - 1; i >= 0; i--)
  {
    cout << Digs[i];
  }
  // вывести конец строки
  cout << '\n';
}

int main(int argc, char* argv[])
{
  PrintNumInHex(0.231E+5);
  return 0;
}

У меня печатает (MSVC6 Debug):
5a3c
Пётр Седов (ушёл с RSDN)
Re[6]: перевод чисел
От: Дмитрий Полищук  
Дата: 25.10.06 10:35
Оценка:
Здравствуйте, Erlond, Вы писали:

E>Здравствуйте, Ovl, Вы писали:

E>

Ovl>>кое что можно прочитать здесь, остальное — гугл. специальным поиском я не занимался, просто пришлось как-то заниматься арифметикой с -2


E>Спасибо большое за информацию


Еще очень хорошо эта тема освящена у Генри Уоррена "Алгоритмические трюки для программистов"
Re[2]: перевод чисел
От: quodum  
Дата: 25.10.06 13:15
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>Если основание не равно 10, то его пишут явно: d.dd...d * pow(Base, Exp).


Ну не всегда. См., например, ISO/IEC 9899:1999, §7.19.6.1:8 (The fprintf function), спецификатор %a. Там используется основание 2. Правда, вместо 'E' пишут 'P'.
Re[3]: printf %a %A
От: Пётр Седов Россия  
Дата: 26.10.06 02:28
Оценка:
Здравствуйте, quodum, Вы писали:
ПС>>Если основание не равно 10, то его пишут явно: d.dd...d * pow(Base, Exp).
Q>Ну не всегда. См., например, ISO/IEC 9899:1999, §7.19.6.1:8 (The fprintf function), спецификатор %a. Там используется основание 2. Правда, вместо 'E' пишут 'P'.
Во-первых, не 2, а 16. Во-вторых, %a (%A) пишет основание "полу-явно": префикс '0x' ('0X') перед мантиссой означает 'основание = 16'. Цитата из MSDN:

printf Type Field Characters


CharacterTypeOutput format
.........
adoubleSigned hexadecimal double precision floating point value having the form [−]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.
AdoubleSigned hexadecimal double precision floating point value having the form [−]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.
.........

Пётр Седов (ушёл с RSDN)
Re[5]: перевод чисел
От: kan Великобритания  
Дата: 26.10.06 08:26
Оценка: :)
vvotan wrote:

> Более того, можно построить систему с дробным, иррациональным,

> комплексным и даже чисто мнимым основанием.
> Некоторые из этих систем имеют весьма интересные свойства.Например, в
> системе счисления по основанию 2i любое комплексное число представимо
> без знака с помощью всего 4-х цифр.
А сколько всего цифр?
Напоминает, "наш новый процессор выполняет любой бесконечный цикл за 4 такта!"
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: printf %a %A
От: quodum  
Дата: 26.10.06 10:36
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>... 'основание = 16'. Цитата из MSDN:

[]

Цитата из ISO/IEC 9899:1999:

A double argument representing a floating-point number is converted in the
style [−]0xh.hhhhp±d,
.....
The exponent always contains at least one digit, and only as many more digits as necessary to represent the
decimal exponent of 2.

Re[6]: перевод чисел
От: vvotan Россия  
Дата: 26.10.06 15:40
Оценка:
Здравствуйте, kan, Вы писали:

kan>vvotan wrote:


>> Более того, можно построить систему с дробным, иррациональным,

>> комплексным и даже чисто мнимым основанием.
>> Некоторые из этих систем имеют весьма интересные свойства.Например, в
>> системе счисления по основанию 2i любое комплексное число представимо
>> без знака с помощью всего 4-х цифр.
kan>А сколько всего цифр?

Всего четыре. А зачем больше, если четырех достаточно?
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.