Поиск:

Ответ в темуСоздание новой темы Создание опроса
> точность вычислений, чисел с плавающей запятой 
:(
    Опции темы
UniBomb
Дата 19.12.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Недавно обнаружил, что при работе с числами с плавающей запятой, результат обычно "показывает погоду". т.е. вместо какого то числа, оно мне выдаёт некую иррациональную дробь, причём явно не ту, какую от неё жду. Почему так происходит? Сначала я думал, что это происходит из-за ограниченности числовой сетки, связанной с форматом чисел. Но в последнее время мне так перестало казаться... Так почему так?

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  12.PNG 29,12 Kb
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 19.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



это изза представления плавающих чисел в памяти

Добавлено @ 17:26 
Код

AnsiString sx;

и в цикле добавь 
sx.sprintf("%.2f",k);
...->Add(sx);



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
UniBomb
Дата 19.12.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Romikgy, 

пасибо... Но это что касается вывода на экран. А вот в процессе работы, числа себя так же вести будут? Т.е. это проблема вывода на экран, а не самих расчётов?
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 19.12.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



это проблема ограничености процессора!
он понимает 1 и 0 , а все что меньше 1 представляется как 1/2 , 1/4, 1/8 и т.д.
дык вот представь такими дробями число 1/3!!!! что получишь?
так что чем больше разрядность , тем точнее конечный результат, но ошибка в вычислениях всегда будет!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
UniBomb
Дата 19.12.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Romikgy, 

ну не такая же как на скриншоте... у меня вполне рациональные дроби... Но кстати говоря, это ограниченность не проца, это ограниченность числовой сетки. С целыми числами и числами с фиксированной запятой он работает великолепно только по той простой причине, что такие числа исчисляемы... Т.е. их конечное число. Когда же проц работает с числами с плавающей запятой, то количество значений в малых промежутках не бесконечно как это есть, а конечно, причём предел этот зависит только от разрядности числа. Например есть два числа 123 и 0,00123 и надо их скажем просуммировать. По правилам сложения находится разность порядка и мантисса числа с меньшим порядком сдвигается на эту разность вправо. Если разрялность маленькая, то после сдвига числа 0,00123 на восемь разрядов вправо, все значащие числа окажутся вне числовой сетки, с которой работает компьютер. Именно поэтому возникает погрешность вычислений... Но у меня то совсем по другому. Оба числа с одиноковым порядком, но почемуто когда я складываю 0 и 0,01 результат получается что то типа 0,0099659798989. Так быть не должно...

Это сообщение отредактировал(а) UniBomb - 19.12.2006, 18:17
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 19.12.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



К чему эта тирада , я не понял smile
особенно с числом 123
но я не понял те не нравится что число 0.01 представляется 
Цитата(UniBomb @  19.12.2006,  17:16 Найти цитируемый пост)
0,0099659798989

этим числом?
ну так напиши свой тип чисел с плавающей запятой, или я чет не понял снова?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
codelord
Дата 19.12.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



пользуйтесь double и будет вам счастье smile

Добавлено @ 20:15 
или long double будет еще точней. 

P.S. 
а флоат на мой взгляд от дьявола smile


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
UniBomb
Дата 19.12.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Romikgy, 

вся эта тирада для того, что бы искоренить в тебе то, что ты называеш "проблема ограничености процессора!", что является неверным... Процессор - это довольно мощный интсрумент, который всё будет делать именно так, как ты ему скажеш и никакой отсебятины. А числа 123 - так, для примера....


codelord, 

Та же история.... только числа не хаотичны, а + "0.0099999999999999", правда почемуто не со всеми числами... Избирательно так сказать....

Это сообщение отредактировал(а) UniBomb - 19.12.2006, 21:15
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 19.12.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



UniBomb, я не пойму, ты получил ответ или нет на свой вопрос?

Цитата(UniBomb @  19.12.2006,  20:13 Найти цитируемый пост)
вся эта тирада для того, что бы искоренить в тебе то, что ты называеш "проблема ограничености процессора!", что является неверным.

имхо из мя чет искоренять , надо еще те поучится какому либо языку, да и процу, его командам, и знать его ограничения!

и второе имхо , ведь тему создал ты, а не я! Я дал ответ , а те судить дал я те ответ или нет.
Или ты ее создал дабы побазарить ? тогда те во Флейм!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
codelord
Дата 19.12.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



UniBomb,
 когда ты попробовал long double надеюсь получил то что тебе нужно. smile 


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
UniBomb
Дата 19.12.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Romikgy, 

сегодня был трудный день, моск отказывался работать...  Какому либо языку, да и процу, его командам я обучен в достаточной степени, что бы понять ответ... Вот что удивительно, в универе все операции с фп (флоат-пойнт, для краткости) числами проходят безошибочно, дома тоже не замечал ничего подобного. Но вот на работе такая засада... 

Цитата

Или ты ее создал дабы побазарить ? тогда те во Флейм!


Нет, тему создал для решения проблемы. А заклинило меня после фразы:

Цитата

он понимает 1 и 0 , а все что меньше 1 представляется как 1/2 , 1/4, 1/8 и т.д.
дык вот представь такими дробями число 1/3!!!! что получишь?


до сих пор не могу понять, что же для тебя есть формат флоат...


codelord, 

Мне надо работать с числами от 0.01 до 5.5. И почему то мне кажется, что для таких маленьких чисел надо использовать такую БОЛЬШУЮ переменную.... Хотя если чесно ещё не пробовал.. Завтра приду на работу, попробую...
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 20.12.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Цитата(UniBomb @  19.12.2006,  22:53 Найти цитируемый пост)
до сих пор не могу понять, что же для тебя есть формат флоат...

вот это и есть
http://www.csu.ac.ru/~yan/informat/tutor1/...iles/nflp_1.htm
http://khpi-iip.mipk.kharkiv.edu/library/d...ra/chapter2.htm
имхо они везде одинаковые



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Vyacheslav
Дата 20.12.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(UniBomb @  19.12.2006,  18:16 Найти цитируемый пост)
числами с фиксированной запятой он работает великолепно только по той простой причине, что такие числа исчисляемы... 

Процессор не может в приципе работать с числами  с фиксированной запятой, так как у него нет отдельного  формат храниния  для таких чисел. Для него все числа с плавающей запятой и вопрос только в том, насколько точно этот формат близок к тому числу, которое Вы пишите на бумаге.
А посему в численных вычислениях такие операции
a == b
где a и b  не являются integer  вполне могут привести к ошибкам.
Да в общем то и в Высшей  математике для этих случаях вводят прогрешность 
То есть два числа считаются равными если их разность взятая по абсолютному значению не превышает заданной величины
| a - b| < e
 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 20.12.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Кстати о птичках smile Borland  специально для тех, кого волнуют ошибки, связанные с представлением  дробных числе в двоичном виде,  предоставляет  специальную структуру  TBcd и кучу процедур работы с ними
Код

#iclude <FmtBcd.hpp>
 

Цитата


The type that stores a binary coded decimal value.
Precision    The number of digits in the decimal version of the value.
SignSpecialPlaces    The sign bit (0 is positive, any other value negative)
the special bit (nonzero indicates that the value is blank)
the number of digits after the decimal (0 to Precision)
Fraction    An array of BCD nibbles, 00 to 99 per byte, high nibble first. Only the first Precision nibbles are used.


Код

struct TBcd

{
  Byte Precision;
  Byte SignSpecialPlaces;
  Byte Fraction[32];
} ;




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
UniBomb
Дата 20.12.2006, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Romikgy, 
Vyacheslav, 

Значит я чего то в своё время упустил.... Возможно причина нашего непониамния в том, что я изучал структуру типов данных для программирования микроконтроллеров (мк). Возможно здесь как раз и кроется разница. А изучал я вот что :

- мк абсолютно неважно, с какими числами вы работаете - он работает только с положительными целыми числами.
- отрицательные числа - есть числа у которых старший байт установлен в единицу
- числа с фиксированной запятой - есть совокупность двух чисел, представляющих полную и дробную части, с которыми программист работает отдельно
- числа с плавающей запятой - примерно то же самое, где порядок мантиссы - есть просто число. Вот тут то и крылась та "белиберда", которую я нёс... Т.е. все действия по приведению типов выполнял программист (тот, кто разрабатывает код на асме. на си такой свистопляски нет), а потом давал мк на вычисление целые числа, результат вычислений программист приводил в тот вид, который ему надо... т.е. один байт - порядок три байта мантисса, при сложении мантиссы приводятся к одному порядку, а потом складываются как обычные трёхбайтовые целые числа. Надо будет поработать над собой... И поэксперементировать с программой...

В общем не злитесь на меня  smile  "я не волшебник - я только учусь" ©
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.