Easyelectronics.ru

Электроника для всех
Текущее время: 16 июл 2018, 09:30

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 04 июл 2017, 20:05 
Только пришел

Зарегистрирован: 17 янв 2017, 20:39
Сообщения: 25
Всем добрый день.
Камень MC9S08AW60, CodeWarrior IDE ver.5.9.0. При создании проекта указал double - 64 bit.
Код примерно такой:
double a;
a = 65535,9999;
OutLCD (a);
a+=0.0001;
OutLCD (a);
При первом выводе на дисплей получаем ожидаемое 65535,9999
А при 2-м: 65536.0004
При значениях чисел < 65536 все ок. А дальше, чем больше число, тем больше искажения. Все в сторону увеличения.
Этот же код, но на AVR работает без ошибок при любых значениях.
Буду бесконечно признателен за любые идеи, как это можно было бы победить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 07 июл 2017, 19:26 
Старожил

Зарегистрирован: 25 авг 2011, 14:00
Сообщения: 2691
Хз почему, но я бы начал с выключения оптимизации в компиляторе. А что будет если добавить 1.0001?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 11 июл 2017, 09:49 
Только пришел

Зарегистрирован: 17 янв 2017, 20:39
Сообщения: 25
Выяснились подробности.
double val1;
double val2;
val1 = 65535.9999;
val2 = 65536.0000;
sprintf (lbuf,"%5.4f", val1);
sprintf (lbuf,"%5.4f", val2);
После выполнения 1-го sprintf, в lbuf[] заносится строка "65535.9999", после выполнения 2-го: "65536.0004"
Вложение:
hw2m.jpg
hw2m.jpg [ 135.4 Кб | Просмотров: 1006 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 11 июл 2017, 14:53 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 357
Откуда: дальнее надмосковье
Думаю проблема в sprintf. Если по умолчанию тип с плавающей запятой у Вашего компилятора single precision то когда Вы пишете это:

double val1 = 65536.0000;
sprintf (lbuf,"%5.4f", val1);

Компилятор на самом деле генерирует код как:

double val1 = 65536.0000;
sprintf (lbuf,"%5.4f", (float)val1);

P.S.
Полтора года прошло с тех пор, а проблема не решена? :)

Добавлено:
Вам нужен код который заберет указатель на double и сконвертирует 8 байтов в формате double precision ieee 754 оттуда в строку.
Гуглите документ "Printing Floating-Point Numbers Quickly and Accurately", или может найдете готовый код основанный на этом документе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 11 июл 2017, 19:02 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 357
Откуда: дальнее надмосковье
Попробуйте эту библиотеку: https://github.com/night-shift/fpconv


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 12 июл 2017, 09:41 
Только пришел

Зарегистрирован: 17 янв 2017, 20:39
Сообщения: 25
arm999, спасибо за советы. К сожалению, библиотека с github не подходит, т.к. данный компилятор воспринимает целые числа в пределах 2^32 - 1. На все что больше - ругается.
Вообще, нужен вывод чисел в пределах до 10^9 с разрешением 0.0001. Т.е. от 0.0001 до 999999999.9999. Довольно-таки частный случай.
Что касается задержки в 1.5 года, заказчик тогда вроде как забил на эту проблему(или не понял о чем речь), а сейчас спохватился. Бывает такое...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 12 июл 2017, 13:26 
Только пришел

Зарегистрирован: 17 янв 2017, 20:39
Сообщения: 25
В общем, победил, точнее обошел. Разделяю на целую и дробную части, потом использую имеющийся калечный sprintf и затем собираю в символьном виде. До 99999999.9999 работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Freescale HCS08. Проблема с числами с плавающей запятой.
СообщениеДобавлено: 12 июл 2017, 13:39 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 357
Откуда: дальнее надмосковье
Чтож, поздравляю, а я уже хотел предлагать попытаться компилировать с SDCC, он вроде умеет работать с 64-битными числами:
support for long long (64 bit, 8 bytes) data types for the z80, z180, r2k, r3ka, gbz80, hc08, s08 and stm8 targets.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB