Добрый вечер!
Помогите советом, не могу до конца понять перевод и представление числа в 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 и переводить? или это можно сделать как-то по другому?
Здравствуйте, 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;
}
Здравствуйте, 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 и переводить? или это можно сделать как-то по другому?
Здравствуйте, 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
То же самое справедливо для любой системы счисления, ну а дальше алгоритм за вами
Здравствуйте, Ovl, Вы писали:
E>>То же самое справедливо для любой системы счисления
Ovl>справедливо для любой системы счисления с положительным основанием
Первый раз слышу о системах счистление с отрицательным основанием, если не трудно, расскажите пожалуйста поподробнее.
Вещественное число 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+6return 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 ));
}
Здравствуйте, Erlond, Вы писали:
E>Здравствуйте, Ovl, Вы писали:
E>>>То же самое справедливо для любой системы счисления
Ovl>>справедливо для любой системы счисления с положительным основанием
E>Первый раз слышу о системах счистление с отрицательным основанием, если не трудно, расскажите пожалуйста поподробнее.
Более того, можно построить систему с дробным, иррациональным, комплексным и даже чисто мнимым основанием.
Некоторые из этих систем имеют весьма интересные свойства.Например, в системе счисления по основанию 2i любое комплексное число представимо без знака с помощью всего 4-х цифр.
Достаточно подробно описано у Кнута.
Здравствуйте, E.Elena, Вы писали: EE>a что делать если число 0.231Е-5, меньше нуля?
Число 0.231E-5 (= 0.00000231) всегда больше нуля.
Кстати, буква 'E' не русская, а английская и означает 'exponent'. Такая запись называется 'экспоненциальное представление числа' (scientific notation).
Здравствуйте, 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;
}
Здравствуйте, Пётр Седов, Вы писали:
ПС>Если основание не равно 10, то его пишут явно: d.dd...d * pow(Base, Exp).
Ну не всегда. См., например, ISO/IEC 9899:1999, §7.19.6.1:8 (The fprintf function), спецификатор %a. Там используется основание 2. Правда, вместо 'E' пишут 'P'.
Здравствуйте, 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
Character
Type
Output format
...
...
...
a
double
Signed hexadecimal double precision floating point value having the form [−]0xh.hhhhp±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.
A
double
Signed hexadecimal double precision floating point value having the form [−]0Xh.hhhhP±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.
vvotan wrote:
> Более того, можно построить систему с дробным, иррациональным, > комплексным и даже чисто мнимым основанием. > Некоторые из этих систем имеют весьма интересные свойства.Например, в > системе счисления по основанию 2i любое комплексное число представимо > без знака с помощью всего 4-х цифр.
А сколько всего цифр?
Напоминает, "наш новый процессор выполняет любой бесконечный цикл за 4 такта!"
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Пётр Седов, Вы писали:
ПС>... 'основание = 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.
Здравствуйте, kan, Вы писали:
kan>vvotan wrote:
>> Более того, можно построить систему с дробным, иррациональным, >> комплексным и даже чисто мнимым основанием. >> Некоторые из этих систем имеют весьма интересные свойства.Например, в >> системе счисления по основанию 2i любое комплексное число представимо >> без знака с помощью всего 4-х цифр. kan>А сколько всего цифр?
Всего четыре. А зачем больше, если четырех достаточно?