PDA

Просмотр полной версии : Вещественное четырёхбайтовое число в строку



Oleg N. Cher
15.10.2018, 22:17
Поскольку процедура будет использоваться с SDCC, то интересует работа с местным вещественным типом float. Местный double, впрочем, ему эквивалентен.

Здесь я уже прошу помощи у вас. Нужно сделать конверсию вещ. числа в строку. Никаких аналогов _ftoa в SDCC, разумеется, нет. sprintf("%f", f) печатает "NO FLOAT", из чего я делаю вывод, что авторами SDCC эта задача не решалась. Может кто-то сталкивался и поделится наработками? Нужно для стандартной библиотеки ZXDev.

http://i.piccy_.info/i9/5f0aeee9a7ae2fbae0da798864a2dddb/1539631032/80365/1214670/ftoa.jpg

Можно использовать ПЗУ Спектрума (впрочем, я не умею переводить SDCC'шные 4-байтные float числа в пятибайтную форму калькулятора ПЗУ. Если кто-то сталкивался, напишите).

Спасибо.

blackmirror
15.10.2018, 22:56
Не знаю чего там в спектрумовском бейсике, а нормальный float можно вывести примерно так:
1) выводим знак, а от числа берем модуль.
2) проверяем является ли оно нулём или бесконечностью и выводим эти значения.
3) разделяем число на мантиссу и двоичный порядок, для нормализованных чисел в мантиссу нужно добавить единицу, которую там не хранят.
4) приводим число к диапазону от 0.1 до 1: пока число меньше 0.1 умножаем его на 10, и подсчитываем сколько раз это было проделано, если больше или равно 1, значит умножаем на 0.1, в итоге мы узнаем десятичный порядок.
5) если двоичный порядок остался не нуль, значит нужно сдвинуть мантиссу вправо.
6) теперь у нас дробное число в диапазоне от 0.1 до 1, которое в цикле можно умножить на 10, чтобы вывести целую часть как очередную цифру, а дробную часть опять можно умножать, пока не будет выведено требуемое количество цифр.
7) в зависимости от того, после скольких цифр мы решили поставить точку, корректируем десятичный порядок, пишем буковку E и выводим его с требуемым знаком.

В 4 пункте вместо циклического умножения на 0.1, можно сравнивать число с 10^32, 10^16, 10^8, 10^4, 10^2, 10, 1 и домножать на обратное, пока число больше, ну и наоборот. Правда 3-4 двоичных разряда на этом можно и потерять, поэтому нужно внимательно следить куда округлены степени 10.

SfS
17.10.2018, 07:47
Не эббите мозг. Sdcc имент printf. Он умеет float в строку. Можно выдернуть и отдельно.
Там при компиляции есть какойто символ, определяющий умеет printf float или нет.
В sdcc-noinit кстати есть примеры с выводом float какието. Или были. Навскидку не помню.
Я сейчас в пути и паглядеть не могу.

- - - Добавлено - - -

https://github.com/salextpuru/sdcc-noinit/blob/master/configs/printf_float.mk

Destr
17.10.2018, 07:51
Не оно-ли? http://zxpress.ru/article.php?id=5539
Вроде на базе этого можно и в строку

Oleg N. Cher
17.10.2018, 18:26
Спасибо, друзья.