Ммм... Запуталась окончательно... у меня по заданию отрицательное 16-ричное нормальзованое число одинарной точности.
На скалолько я поняла, любое число можно представить как
A=m*s^p, где
m-мантисса, s-основание системы счисления, p — порядок.
Число нормализованое — это число например,
0.1AE4F*E+4.
Или я ошибаюсь?
Ввести мне по задаче его нужно именно,как
знак — ...
мантисса — ...
порядок — ...
Получается если я введу
знак — 1 (что есть отрицательное)
мантисса — 1AE4F (в последствии преобразуется к виду 0.1AE4F)
порядок — 4.
Я понимаю как переводить и дробную и целую часть шестнадцатиричного числа в десятичное,
вопрос вот в чем, можно ли как то перевести отдельно порядок 16-го числа в 10-е,
или само число надо будет предварительно перевести к виду
0.1AE4F*E+4=1AE4.F и потом уже переводить в 10-е число?
Здравствуйте, E.Elena, Вы писали:
EE>Ммм... Запуталась окончательно... у меня по заданию отрицательное 16-ричное нормальзованое число одинарной точности.
Сама всех путаешь. Задание должно состоять из двух частей: "дано" и "найти". Что дано и что найти?
Как я тебя понял,
— дано: строка, в которой шестнадцатиричная запись числа: -0.hhhhh * 16^hh (где и основание дроби, и основание записи порядка, и основание порядка — все шестнадцатиричные).
— — или же: -0.hhhhh * 2^hh, или -0.hhhhh * 2^dd — в общем, уточни
— найти: строку с десятичной записью этого же числа.
EE>Я понимаю как переводить и дробную и целую часть шестнадцатиричного числа в десятичное,
EE>вопрос вот в чем, можно ли как то перевести отдельно порядок 16-го числа в 10-е,
EE>или само число надо будет предварительно перевести к виду
EE>0.1AE4F*E+4=1AE4.F и потом уже переводить в 10-е число?
Ты хочешь это задействовать плавающую арифметику, встроенную в Си, или же всё руками сделать? В принципе, можно и так, и этак.
Самое простое — это
1) прочесть из строки знак, мантиссу и порядок,
2) запихать их в битовые поля 64-битной структуры, представляющей double (единственно, при
3) полученый double вывести с помощью printf или gcvt
Можно обойтись и без знания о внутренностях double и собрать его по формуле
int sign;
unsigned fracpart; unsigned fraclen; // значение и длина дроби
unsigned exp; // порядок
double x;
x = sign * fracpart * pow(16, exp-fraclen);
x = sign * ldexp(fracpart, (exp-fraclen)*4); // то же самое
А руками... тут надо подумать.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, quodum, Вы писали:
Q>Цитата из ISO/IEC 9899:1999:
Q>Q>A double argument representing a floating-point number is converted in the style [-]0xh.hhhhp±d,
Q>.....
Q>The exponent always contains at least one digit, and only as many more digits as necessary to represent the decimal exponent of 2.
Эта двойка — не основание системы счисления. По-английски 'основание системы счисления' — это 'base' или 'radix'.
Мантисса пишется двоичными цифрами (binary digits) <=> основание = 2. printf так не умеет писать.
Мантисса пишется десятичными цифрами (decimal digits) <=> основание = 10. Так пишут %f, %e, %E, %g, %G.
Мантисса пишется шестнадцатиричными цифрами (hexadecimal digits) <=> основание = 16. Так пишут %a, %A. Основание пишется "полу-явно" префиксами '0x' и '0X'. В языках C/C++ эти префиксы используются для записи чисел в шестнадцатиричной нотации (основание = 16).
Здравствуйте, Кодт, Вы писали:
К>К> int p = 1 + int(floor( log(x)/log(10) )); // x = 0.zzzzttttt * 10^p
К>
Если заменить 'log(x) / log(10)' на 'log10(x)', то погрешность может быть меньше.