Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Магия чисел 
:(
    Опции темы
Salatovec
Дата 4.8.2009, 09:11 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Доброго всем времени суток, вот отрезок кода:
Код

double t0 = 0.0;
double h = 0.0001

for(double t=t0;;t+=h)
{
//тело цикла
}

в цикле считаю некоторые параметры и вывожу их в Мемо в билдере, в частности вывожу t и получается, что в какой-то момент начинают выскакивать значения t типа 0,00670000000000001 или 0,00999999999999999. Почему так происходит? Эти значения не просто мозолят глаза, но и портят программу. Заранее спасибо!

Это сообщение отредактировал(а) Salatovec - 4.8.2009, 09:12
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Герб Саттер)

Я бы сказал - с известной долей самомнения - что все программисты делятся на три группы: те кто знают, что они не понимают вычисления с плавающей запятой (и они правы), те, кто думают, что они понимают их (но они ошибаются); и те немногие эксперты, которые совсем не уверены в том, что когда нибудь полностью сумеют разобраться в вычислениях с плавающей запятой (и это мудро).


Цитата(Salatovec @  4.8.2009,  09:11 Найти цитируемый пост)
в цикле считаю некоторые параметры и вывожу их в Мемо в билдере, в частности вывожу t и получается, что в какой-то момент начинают выскакивать значения t типа 0,00670000000000001 или 0,00999999999999999. Почему так происходит? Эти значения не просто мозолят глаза, но и портят программу. Заранее спасибо!

это бесконечный цикл, что, так и должно быть? В какой момент это происходит?

Это сообщение отредактировал(а) azesmcar - 4.8.2009, 09:53
PM   Вверх
Salatovec
Дата 4.8.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Цикл завершается, когда в нем параметр скорости достигает нуля, а выводятся результаты каждой итерации, в частности: 
Код

Memo1->Lines->Add(FloatToStr(t));



Это сообщение отредактировал(а) Salatovec - 4.8.2009, 11:06
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Salatovec

Скорее всего проблема в конвертации из double во float (функция принимает float а передается ей double).

PM   Вверх
Romikgy
Дата 4.8.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Salatovec @  4.8.2009,  08:11 Найти цитируемый пост)
Почему так происходит?

специфика работа с числами с плавающей точкой 
выход округляй результат перед выводом .....


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

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Округлял, делал так FloatToStrF(t,ffFixed,1,4). Вначале все нормально, а потом там, где должны идти числа :
0,0110 
0,0120 
0,0130 
и т.д. 

идут: 
0.0100 
0.0100 
0.0100

Это и портит программу (
PM MAIL   Вверх
andrew_121
Дата 4.8.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

Репутация: 10
Всего: 33



Тебе же ответили:
Цитата(azesmcar @  4.8.2009,  11:25 Найти цитируемый пост)
функция принимает float а передается ей double




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 4.8.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Герб Саттер)

Запомните, вычисления с плавающей точкой - таинственная и странная вещь. Будьте внимательнее при использовании чисел с плавающей точкой и избегайте преобразования чисел с плавающей точкой. Почти все, что люди (как они думают) знают об арифметике, оказывается не верно применительно к вычислениям с плавающей точкой.

и еще
Цитата(Standard)

An rvalue of floating point type can be converted to an rvalue of another floating point type. If the source
value can be exactly represented in the destination type, the result of the conversion is that exact representation.
If the source value is between two adjacent destination values, the result of the conversion is an
implementation-defined choice of either of those values. Otherwise, the behavior is undefined.


Это сообщение отредактировал(а) azesmcar - 4.8.2009, 12:31
PM   Вверх
Salatovec
Дата 4.8.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



С float та же тема =\
PM MAIL   Вверх
andrew_121
Дата 4.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

Репутация: 10
Всего: 33



Salatovec, В смысле?
В приведенном тобой коде, заменил double на float?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Salatovec
Дата 4.8.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Цитата(andrew_121 @ 4.8.2009,  13:02)
Salatovec, В смысле?
В приведенном тобой коде, заменил double на float?

Угу, или я неправильно понял?
PM MAIL   Вверх
Friackazoid
Дата 4.8.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 23.2.2006

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



Замени float на double и никогда больше не используй эту пакость.
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
Salatovec
Дата 4.8.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



Итак в начале использовал double, ни то, ни то не пашет (((
PM MAIL   Вверх
andrew_121
Дата 4.8.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

Репутация: 10
Всего: 33



Код

#include <stdio.h>

int main() {

    char buff[32] = "\0";
    double summ = 0;
    const double step = 0.0001;
    
    while ( summ < 1.0 ) {
        summ += step;
        printf("%.04f\n", summ);
                /* sprintf(buff, "%.04f", summ); */
    }

    return 0;
}


Добавлено через 1 минуту и 25 секунд
Цитата(Salatovec @  4.8.2009,  13:41 Найти цитируемый пост)
Итак в начале использовал double, ни то, ни то не пашет ((( 

Тебе уже объяснили почему так происходит.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Salatovec
Дата 4.8.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 9.1.2008

Репутация: нет
Всего: -1



А зачем char buff[32] = "\0"; ?

Добавлено через 1 минуту и 58 секунд
Хм, а теперь нормально отображает о_О в чём отличие от моего цикла?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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