![]() |
|
|
![]()
|
|
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Недавно обнаружил, что при работе с числами с плавающей запятой, результат обычно "показывает погоду". т.е. вместо какого то числа, оно мне выдаёт некую иррациональную дробь, причём явно не ту, какую от неё жду. Почему так происходит? Сначала я думал, что это происходит из-за ограниченности числовой сетки, связанной с форматом чисел. Но в последнее время мне так перестало казаться... Так почему так?
Присоединённый файл ( Кол-во скачиваний: 15 )
12.PNG 29,12 Kb |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
это изза представления плавающих чисел в памяти
Добавлено @ 17:26
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Romikgy,
пасибо... Но это что касается вывода на экран. А вот в процессе работы, числа себя так же вести будут? Т.е. это проблема вывода на экран, а не самих расчётов? |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
это проблема ограничености процессора!
он понимает 1 и 0 , а все что меньше 1 представляется как 1/2 , 1/4, 1/8 и т.д. дык вот представь такими дробями число 1/3!!!! что получишь? так что чем больше разрядность , тем точнее конечный результат, но ошибка в вычислениях всегда будет! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Romikgy,
ну не такая же как на скриншоте... у меня вполне рациональные дроби... Но кстати говоря, это ограниченность не проца, это ограниченность числовой сетки. С целыми числами и числами с фиксированной запятой он работает великолепно только по той простой причине, что такие числа исчисляемы... Т.е. их конечное число. Когда же проц работает с числами с плавающей запятой, то количество значений в малых промежутках не бесконечно как это есть, а конечно, причём предел этот зависит только от разрядности числа. Например есть два числа 123 и 0,00123 и надо их скажем просуммировать. По правилам сложения находится разность порядка и мантисса числа с меньшим порядком сдвигается на эту разность вправо. Если разрялность маленькая, то после сдвига числа 0,00123 на восемь разрядов вправо, все значащие числа окажутся вне числовой сетки, с которой работает компьютер. Именно поэтому возникает погрешность вычислений... Но у меня то совсем по другому. Оба числа с одиноковым порядком, но почемуто когда я складываю 0 и 0,01 результат получается что то типа 0,0099659798989. Так быть не должно... Это сообщение отредактировал(а) UniBomb - 19.12.2006, 18:17 |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
К чему эта тирада , я не понял
особенно с числом 123 но я не понял те не нравится что число 0.01 представляется этим числом? ну так напиши свой тип чисел с плавающей запятой, или я чет не понял снова? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
пользуйтесь double и будет вам счастье
Добавлено @ 20:15 или long double будет еще точней. P.S. а флоат на мой взгляд от дьявола |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Romikgy,
вся эта тирада для того, что бы искоренить в тебе то, что ты называеш "проблема ограничености процессора!", что является неверным... Процессор - это довольно мощный интсрумент, который всё будет делать именно так, как ты ему скажеш и никакой отсебятины. А числа 123 - так, для примера.... codelord, Та же история.... только числа не хаотичны, а + "0.0099999999999999", правда почемуто не со всеми числами... Избирательно так сказать.... Это сообщение отредактировал(а) UniBomb - 19.12.2006, 21:15 |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
UniBomb, я не пойму, ты получил ответ или нет на свой вопрос?
имхо из мя чет искоренять , надо еще те поучится какому либо языку, да и процу, его командам, и знать его ограничения! и второе имхо , ведь тему создал ты, а не я! Я дал ответ , а те судить дал я те ответ или нет. Или ты ее создал дабы побазарить ? тогда те во Флейм! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
UniBomb,
когда ты попробовал long double надеюсь получил то что тебе нужно. |
|||
|
||||
| UniBomb |
|
||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Romikgy,
сегодня был трудный день, моск отказывался работать... Какому либо языку, да и процу, его командам я обучен в достаточной степени, что бы понять ответ... Вот что удивительно, в универе все операции с фп (флоат-пойнт, для краткости) числами проходят безошибочно, дома тоже не замечал ничего подобного. Но вот на работе такая засада...
Нет, тему создал для решения проблемы. А заклинило меня после фразы:
до сих пор не могу понять, что же для тебя есть формат флоат... codelord, Мне надо работать с числами от 0.01 до 5.5. И почему то мне кажется, что для таких маленьких чисел надо использовать такую БОЛЬШУЮ переменную.... Хотя если чесно ещё не пробовал.. Завтра приду на работу, попробую... |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 11 Всего: 146 |
вот это и есть http://www.csu.ac.ru/~yan/informat/tutor1/...iles/nflp_1.htm http://khpi-iip.mipk.kharkiv.edu/library/d...ra/chapter2.htm имхо они везде одинаковые -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Процессор не может в приципе работать с числами с фиксированной запятой, так как у него нет отдельного формат храниния для таких чисел. Для него все числа с плавающей запятой и вопрос только в том, насколько точно этот формат близок к тому числу, которое Вы пишите на бумаге. А посему в численных вычислениях такие операции a == b где a и b не являются integer вполне могут привести к ошибкам. Да в общем то и в Высшей математике для этих случаях вводят прогрешность То есть два числа считаются равными если их разность взятая по абсолютному значению не превышает заданной величины | a - b| < e -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Кстати о птичках
-------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Romikgy,
Vyacheslav, Значит я чего то в своё время упустил.... Возможно причина нашего непониамния в том, что я изучал структуру типов данных для программирования микроконтроллеров (мк). Возможно здесь как раз и кроется разница. А изучал я вот что : - мк абсолютно неважно, с какими числами вы работаете - он работает только с положительными целыми числами. - отрицательные числа - есть числа у которых старший байт установлен в единицу - числа с фиксированной запятой - есть совокупность двух чисел, представляющих полную и дробную части, с которыми программист работает отдельно - числа с плавающей запятой - примерно то же самое, где порядок мантиссы - есть просто число. Вот тут то и крылась та "белиберда", которую я нёс... Т.е. все действия по приведению типов выполнял программист (тот, кто разрабатывает код на асме. на си такой свистопляски нет), а потом давал мк на вычисление целые числа, результат вычислений программист приводил в тот вид, который ему надо... т.е. один байт - порядок три байта мантисса, при сложении мантиссы приводятся к одному порядку, а потом складываются как обычные трёхбайтовые целые числа. Надо будет поработать над собой... И поэксперементировать с программой... В общем не злитесь на меня |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |