Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с числами с плавающей запятой
СообщениеДобавлено: 05 июл 2017, 11:14 
Не в сети
Начинающий
Зарегистрирован:
05 июл 2017, 10:39
Сообщений: 4
Cпасибо сказано: 0
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Всем здравствуйте.
Есть некая прога, написанная на С, в которой интенсивно используются числа с плавающей запятой в формате IEEE64. Прога написана для микроконтроллера семейства HCS08 Freescale. Для написания и компиляции использовалась среда CodeWarrior IDE ver.5.9.0. Думаю что это не имеет значения. На определенном этапе было замечено, что происходит искажение чисел, значение которых превышает 65536. Например, 65535,9999 таким и остается, а 65536 само по себе превращается в 65536.0004. Чем больше число, тем больше искажение. Все в сторону увеличения.
Код примерно такой:
double a;
a = 65535,9999;
OutLCD (a);
a+=0.0001;
OutLCD (a);
При первом выводе на дисплей получаем ожидаемое 65535,9999
А при 2-м: 65536.0004
В системе имеется файл float.h (прилагается), который вроде как задает конфигурацию чисел с плавающей запятой. Может есть смысл поиграться с его настройками?
Буду бесконечно признателен за любые идеи, в чем проблема, и как это можно было бы победить.

PS. Файл не добавляется почему-то, копирую его сюда:
/*****************************************************
float.h - ANSI-C library: floating point format
----------------------------------------------------
Copyright (c) Metrowerks, Basel, Switzerland
All rights reserved
Do not modify!
*****************************************************/

#ifndef _H_FLOAT_
#define _H_FLOAT_

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(__HIWARE__) && defined(__MWERKS__) && defined(__PPC__)
/* Metrowerks PowerPC compiler does not define the stuff below */
#define __FLOAT_IS_IEEE32__
#define __DOUBLE_IS_IEEE64__
#endif

/**** Rounding Mode */

#define FLT_ROUNDS -1
#define FLT_RADIX 2

/**** float */

#ifdef __FLOAT_IS_IEEE32__

#define FLT_MANT_DIG 24
#define FLT_DIG 6
#define FLT_MIN_EXP -126
#define FLT_MIN_10_EXP -37
#define FLT_MAX_EXP 127
#define FLT_MAX_10_EXP 38
#define FLT_MAX 3.402823466E+38F
#define FLT_EPSILON 1.19209290E-07F
#define FLT_MIN 1.17549435E-38F

#endif

#ifdef __DOUBLE_IS_IEEE32__
/**** double */

#define DBL_MANT_DIG FLT_MANT_DIG
#define DBL_DIG FLT_DIG
#define DBL_MIN_EXP FLT_MIN_EXP
#define DBL_MIN_10_EXP FLT_MIN_10_EXP
#define DBL_MAX_EXP FLT_MAX_EXP
#define DBL_MAX_10_EXP FLT_MAX_10_EXP
#define DBL_MAX FLT_MAX
#define DBL_EPSILON FLT_EPSILON
#define DBL_MIN FLT_MIN

#endif

#ifdef __DOUBLE_IS_IEEE64__
/**** double */

#define DBL_MANT_DIG 53
#define DBL_DIG 15
#define DBL_MIN_EXP -1022
#define DBL_MIN_10_EXP -307
#define DBL_MAX_EXP 1023
#define DBL_MAX_10_EXP 308
#define DBL_MAX 1.7976931348623157E+308
#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_MIN 2.2259738585972014E-308

#endif



#ifdef __FLOAT_IS_DSP__
/* DSP float */

#define FLT_MANT_DIG 16
#define FLT_DIG 4
#define FLT_MIN_EXP -32768
#define FLT_MIN_10_EXP -9863
#define FLT_MAX_EXP 32767
#define FLT_MAX_10_EXP 9863
#define FLT_MAX 0.9999695E+9863F
#define FLT_EPSILON 3.051757E-05F
#define FLT_MIN 0.9999695E+9863F

#endif

#ifdef __DOUBLE_IS_DSP__
/**** double */

#define DBL_MANT_DIG 16
#define DBL_DIG 4
#define DBL_MIN_EXP -32768
#define DBL_MIN_10_EXP -9863
#define DBL_MAX_EXP 32767
#define DBL_MAX_10_EXP 9863
#define DBL_MAX 0.9999695E+9863F
#define DBL_EPSILON 3.051757E-05F
#define DBL_MIN 0.9999695E+9863F

#endif

/**** long double */

#define LDBL_MANT_DIG DBL_MANT_DIG
#define LDBL_DIG DBL_DIG
#define LDBL_MIN_EXP DBL_MIN_EXP
#define LDBL_MIN_10_EXP DBL_MIN_10_EXP
#define LDBL_MAX_EXP DBL_MAX_EXP
#define LDBL_MAX_10_EXP DBL_MAX_10_EXP
#define LDBL_MAX DBL_MAX
#define LDBL_EPSILON DBL_EPSILON
#define LDBL_MIN DBL_MIN


#ifdef __cplusplus
}
#endif

#endif

/*****************************************************/
/* end float.h */

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 05 июл 2017, 23:04 
Не в сети
Одарённый
Зарегистрирован:
27 май 2015, 20:47
Сообщений: 123
Cпасибо сказано: 3
Спасибо получено:
26 раз в 25 сообщениях
Очков репутации: 2

Добавить очки репутацииУменьшить очки репутации
Вы можете поменять компилятор или другой микроконтроллер и попробовать свою программу снова?

Ошибка может быть по многим причинам. Я не сильно разбираюсь в микроконтроллерах, но может быть это аппаратная ошибка или компилятор генерирует неправильные инструкции для процессора.

Редактировать файлы из стандартной библиотеки не рекомендую.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 05 июл 2017, 23:23 
Не в сети
Начинающий
Зарегистрирован:
05 июл 2017, 10:39
Сообщений: 4
Cпасибо сказано: 0
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Спасибо за Ваш ответ, SAVANTOS. На другом микроконтроллере (и соответственно с другим компилятором) все работает как надо. Но мне нужно чтобы именно на этом работало. Файлы из стандартной библиотеки всегда можно вернуть в исходное состояние. Однако таким путем мне не удалось ничего добиться.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 05 июл 2017, 23:27 
Не в сети
Оракул
Зарегистрирован:
13 дек 2015, 18:51
Сообщений: 705
Cпасибо сказано: 79
Спасибо получено:
109 раз в 98 сообщениях
Очков репутации: 3

Добавить очки репутацииУменьшить очки репутации
Такой вариант, заменить
a+=0.0001;
на
double b
b=0.0001;
a+=b;

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 06 июл 2017, 00:39 
Не в сети
Одарённый
Аватара пользователя
Зарегистрирован:
31 мар 2017, 01:16
Сообщений: 149
Cпасибо сказано: 8
Спасибо получено:
46 раз в 41 сообщениях
Очков репутации: 11

Добавить очки репутацииУменьшить очки репутации
Не помешает проверить, установлен ли флажок на 32-битные "плавающие точки".

Однажды на каком-то компиляторе встречал "по умолчанию" 24-битные плавающие. Нужно было явно указывать -DIEEE32 или типа того, чтобы включилось полномасштабное вычисление.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 06 июл 2017, 11:06 
Не в сети
Одарённый
Зарегистрирован:
27 май 2015, 20:47
Сообщений: 123
Cпасибо сказано: 3
Спасибо получено:
26 раз в 25 сообщениях
Очков репутации: 2

Добавить очки репутацииУменьшить очки репутации
Нашёл похожую проблему на форуме NXP. Там говорится, что при создании проекта есть выбор-какой формат использовать для типов float и double. У вас было что-то похожее?

Скорее всего такие ошибки из-за того что используется одинаковый формат представления для float и double.


https://community.nxp.com/thread/383411

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 06 июл 2017, 14:33 
Не в сети
Начинающий
Зарегистрирован:
05 июл 2017, 10:39
Сообщений: 4
Cпасибо сказано: 0
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
bimol, я показал здесь лишь простейший пример. На самом деле оно всегда добавляет эти свои 0.0004
Xmas, при создании проекта все флажки были установлены как надо: double - IEEE64
SAVANTOS, это я пытался что-то у них выяснить, но такой "обход" как они предлагают, мне не подходит.
Всем спасибо!

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 06 июл 2017, 15:18 
Не в сети
Оракул
Зарегистрирован:
13 дек 2015, 18:51
Сообщений: 705
Cпасибо сказано: 79
Спасибо получено:
109 раз в 98 сообщениях
Очков репутации: 3

Добавить очки репутацииУменьшить очки репутации
Я к тому, что все константы надо объявлять через переменные double или явно указывать, что константа double
Иначе проблема зарыта глубоко.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 11 июл 2017, 08:51 
Не в сети
Начинающий
Зарегистрирован:
05 июл 2017, 10:39
Сообщений: 4
Cпасибо сказано: 0
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Выяснились подробности.
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"

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Проблема с числами с плавающей запятой
СообщениеДобавлено: 11 июл 2017, 10:15 
Не в сети
Одарённый
Аватара пользователя
Зарегистрирован:
31 мар 2017, 01:16
Сообщений: 149
Cпасибо сказано: 8
Спасибо получено:
46 раз в 41 сообщениях
Очков репутации: 11

Добавить очки репутацииУменьшить очки репутации
dersu-uzalah

Очень похоже на баг компилятора. В 65536.000 вообще неоткуда взяться 0.0004 - у этого числа в двоичном плавающем формате в мантиссе одни нули и ничего кроме нулей.

Так что Вы тут ни при чём. Это всё компилятор.

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

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Действия с комплексными числами.

в форуме Тригонометрия

igery

0

178

13 дек 2011, 21:23

Действия с комплексными числами

в форуме Комплексный анализ и Операционное исчисление

_Astarta_

6

159

22 сен 2015, 19:55

Действия с комплексными числами

в форуме Алгебра

_Astarta_

3

159

22 сен 2015, 16:28

Уравнение с комлексными числами

в форуме Линейная и Абстрактная алгебра

kaloyan

1

67

06 ноя 2016, 15:22

Задачи с комплексными числами

в форуме Начала анализа и Другие разделы школьной математики

ioleg

7

597

14 ноя 2013, 22:11

Уравнения с комплексными числами

в форуме Начала анализа и Другие разделы школьной математики

Jaspe

8

839

28 апр 2013, 19:45

Разобраться с комплексными числами

в форуме Комплексный анализ и Операционное исчисление

luxor92

1

116

07 фев 2016, 11:39

Выражение с комплексными числами

в форуме Комплексный анализ и Операционное исчисление

linki770

7

390

23 май 2013, 15:58

Выражение с комплексными числами

в форуме Комплексный анализ и Операционное исчисление

linki770

15

343

23 май 2013, 16:03

Уравнения с комплексными числами

в форуме Начала анализа и Другие разделы школьной математики

dasha math

2

241

14 дек 2014, 11:25


Часовой пояс: UTC + 4 часа [ Летнее время ]



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

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


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

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

Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved