** Михаил |
Отправлено: 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
|
|
|