Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод вещественного числа с плавающей точкой в строку  (Прочитано 18848 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xRom
Интересующийся

ru
Offline Offline

« : 16-05-2011 12:58 » 

Как грамотно это делают? Поделитесь пожалуйста алгоритмом, сам код не нужен. Пока что я загружаю число, раскладываю его екстрактом на экспоненту и мантиссу, перевожу экспоненту в десятичное значение при помощи десятичного логарифма двойки а дальше? Как мантиссу превратить в десятичное значение максимальной точности и превратить в строку? Ну то есть мантиссу хочу выводить почти ввсе 64 бита по возможности, а то сейчас у меня ошибки лезут уже после 5-го знака после запятой.
« Последнее редактирование: 17-05-2011 14:23 от xRom » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-05-2011 16:31 » 

Целочисленным делением. Фиксированная точка - тоже целое число - позиция точки условна.
Никаких логарифмов - тупое вычитание и сдвиг делителя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xRom
Интересующийся

ru
Offline Offline

« Ответ #2 : 16-05-2011 18:38 » 

Прости не совсем понял как можно обойтись целочисленной арифметикой, ведь если рассмотреть экспоненту как целое число то перевести его в десятичную форму не сложно, но проблема в том что оно выражает число ДВОИЧНЫХ разрядов точки, его можно было бы разделить на 4 и получить экспоненту для восьмеричной системы счисления, или на 8 - для шестнадцатиричной, но десятичное значение будет дробным. Верно?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-05-2011 20:51 » 

Читаю в заголовке темы: "вещественного числа с фиксированной точкой". Откуда в fixed point экспонента взялась? Ты ни чего не путаешь? Давай сперва с терминами разберемся, чтобы понапрасну время не тратить.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xRom
Интересующийся

ru
Offline Offline

« Ответ #4 : 16-05-2011 21:12 » 

Я имею ввиду те числа которыми оперирует сопроцессор. Нормализованные, экспоненциальные.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 16-05-2011 21:21 » 

Это float point - числа с плавающей точкой.
Переименую тему, чтобы не было недоразумений.

Если не понятно почему, почитай тут:
fixed point
float point



Да, тут задачка немного сложнее, но принцип ее тот же: последовательным делением на 10n. Число шагов - как бит в мантисе. Стартовый "n" можно определить по floor(ln(X)/ln(10)).

Добавлено через 8 часов, 38 минут и 47 секунд:
Но думаю, что быстрее все-таки было бы довести число умножением на 10lg(M) (степень надо уточнить) до диапазона последней цифры диапазона (18-й значащий десятичный знак до запятой) и сохранил бы как BCD. Т.е. все операции внутри FPU. Потом надо только разобраться с отображением и установкой запятой.
« Последнее редактирование: 17-05-2011 06:12 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #6 : 17-05-2011 06:27 » 

Если не путаю, lg(M) там что-то типа 308 (для типа double (64-ре бита)).

Сохранить как BCD можно командой FBSTP.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 17-05-2011 16:22 » 

Последний мой абзац с ошибками. Не логафим мантисы - логарифм экспоненты: lg(2E). Не суть важно, если формула не точна - я только идею хочу передать. Нужно "нормализовать" плавающее значение умножением на 10n, чтобы оно вошло в диапазон: от 1017 до (1018 - 1). Потом сохранить как BCD (будет 18 цифр + знак).
« Последнее редактирование: 17-05-2011 16:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xRom
Интересующийся

ru
Offline Offline

« Ответ #8 : 11-10-2011 16:07 » 

Сорри за долгое отсутствие, но вернулся к вопросу а гляжу тут ответили.... Командир я понял идею насчет доумножения, в принципе мысль ясна, но вот перевод экспоненты из двоичного представления в десятичное вызвал вопросы: я понял что ее надо умножить на fldlg2, но перевод получается неверный в случае если мантисса начинается с десятичной 8 или 9. То есть при переводе экспонента получается больше чем есть на самом деле на 1. И режимами округления эту проблему не убрать, потому что при первых цифрах 1-3 - значение получается меньше, но при округлении становится верным.
Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #9 : 11-10-2011 16:44 » new

xRom,
Может пригодиться Улыбаюсь
Я при небольшой разрядности дробной части использовал табличный метод (если нужен только вывод сторки, без матматики)
(0.100) = "0.5"
(0.010) = "0.25"
....
« Последнее редактирование: 11-10-2011 16:48 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines