C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Пишу свою игру. Есть несколько несложных вопросов, Пишу свою игру. Есть несколько несложных
** Михаил
Отправлено: 27.08.2005, 21:39


Не зарегистрирован







Пишу свою игру.
Есть несколько вопросов. Пока могу сформулировать 1 вопрос:
1) У меня есть некая функция:
CODE

float good(int type, int n)
{
   float r, m, v, p, t=0;
   if(n==1)
   {
       m=3;
       v=5;
       p=0.5;
   }
   if (type >= 2 && type <= 300)
   {
       t = t + type;
       r = p*t/100;  
   }
   return r;
}

Вызываю ее:
good(70,1);
т.е. у меня должно возвратится значение 0.35.
а получается почему то : 0.349999990692... и что это?
почему при возвращении получаятся какаято абракодабра?

Отредактировано olegenty — 28/08/2005, 09:25
BreakPointMAN
Отправлено: 28.08.2005, 01:18


Станционный диспетчер

Группа: Участник
Сообщений: 86



во-первых, нельзя писать
QUOTE (** Михаил @ 27/08/2005, 21:39)

float r, m, v, p, t=0;

...вернее, писать так можно, и это не будет синтаксической ошибкой... но нужно тогда иметь в виду, что здесь объявляется 5 переменных действительного типа: r, m, v, p и t, а инициализируется значением "0" только одна переменная t. Следовательно, в непроинициализированных переменных может содержаться мусор, и непосредственно их использовать не рекомендуется — чревато ошибками. Вот.


далее... зачем ты после каждой закрывающей фигурной скобки ставишь точку с запятой?
QUOTE (** Михаил @ 27/08/2005, 21:39)

if(n==1)
{
m=3;
v=5;
p=0.5;
};
if(type>=2&&type<=300) {t=t+type; r=p*t/100; };
return r;
};

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


далее... вот тут непроинициализированные переменные могут подбросить тебе ложку дегтя в бочку меда... либо сделай что-то вроде
CODE

float r=0, m=0, v=0, p=0, t=0;

или
CODE

float r, m, v, p, t;
r=m=v=p=t=0;

или же потом, в теле функции, далее явно задавай им значения... а не так, что у тебя куча if-ов, и в зависимости от условий то ли проинициализируются они, то ли нет...


QUOTE (** Михаил @ 27/08/2005, 21:39)

у меня должно возвратится значение 0.35. а получается почему то : 0.349999990692... и что это?

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

а вообще, советую сначала почитать книжечку по C++... хотя бы "Язык Си++" © Подбельский В.В. ... вотс... %)

Отредактировано BreakPointMAN — 28/08/2005, 01:21
** Михаил
Отправлено: 28.08.2005, 07:12


Не зарегистрирован







во-первых: мне только одной и нужно было дать значение.
во-вторых: точка-запятая после скобок — совсем не ошбика, т.к. это ни на что не мешает.
в-третьих: ты так и не ответил. Может я не ясно выразился:

у меня есть срока :
r=p*t/100;

Если я пишу Form1->Caption=FloatToStr(p*t/100); , то на моей форме светится "3.5" — что мне и нужно.
А если я пишу Form1->Caption=FloatToStr®; , то на моей форме светится
"0.3499999903763" — это нормально??? чего-то я не видел, чтобы в книгах писали про самопроизвольное присваивание значения переменной.
** михаил
Отправлено: 28.08.2005, 07:13


Не зарегистрирован







( r ), а не ®
olegenty
Отправлено: 28.08.2005, 08:26


Ветеран

Группа: Модератор
Сообщений: 2412



замени float на double или long double, и станет легче. кроме прочего — пользуйся тегами CODE
** Михаил
Отправлено: 28.08.2005, 12:24


Не зарегистрирован







olegenty , спасибо!!! Все заработало!
а все-таки почему в данном случае double работает, а float дает сбой?
Rius
Отправлено: 28.08.2005, 18:11


Мастер участка

Группа: Участник
Сообщений: 321



Михаил внимательно прочти еще раз ответ BreakPointMAN, там все верно.

у double точность выше, но ошибки такого типа тоже есть (здесь ты их не видишь).

Отредактировано Rius — 28/08/2005, 21:12

Вернуться в Вопросы программирования в C++Builder