| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
туплю с for() на С
вот такая прога
#include <iostream.h> main() {double y=0.8, x=0.5 ; for( ;x<y; x+=0.1) cout<<x<<" ";} выводит 0.5 0.6 0.7 0.8, но при y=0.7 выводит уже 0.5 0.6 Касячит при y=0.8, 0.9, 1.0, 1.1 Проверял на ВижуалС,Билдере,g++ Не дайте сойти с ума,укажите где я налошил? |
|
|
# 2 |
|
::VIP::
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
так все правильно, условие-то x<y, а когда x (при y=0.7) получается 0.7, то соответственно 0.7<0.7 - неверное неравенство, так что меняй условие на x<=y...
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным. |
|
|
|
|
# 6 |
|
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ЧересЧеловек, тебе ведь дали наводку...
Невозможно _точно_ представить флоат/дабл в двоичном виде - всегда будет погрешность. например, выполнение такого кода совершенно не гарантируется: if( 5.9999 + 0.0001 == 6.0 ) ***; на эту тему обычно можно почитать в любой литературе по С рангом чуть выше, чем "С++ за 12 дней" - там же даются и советы, как обойти возможные глюки типа твоего. у тебя же - классический случай, когда 0,7+0,1 != 0,8 иллюстрация примерно такая - 0,7 - 0000000000011111111111100 0,1 - 0000000000000000000000001 0,8 - 0000000000100000000000000 думаю, смысл понятен
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
|
|
|
# 8 |
|
Добрый фей-мод
Регистрация: 18.09.2002
Адрес: Израиль
Пол: Male
Сообщения: 4 155
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ЧересЧеловек
Все верно сказано. Даже если ты напишешь y= 0.8, это может оказаться 0.8000000000000001. поэтому либо сам округляй, либо пользуйся специальными функциями сравнения флоат/дабл. Такие есть во многих библиотеках.
__________________
Фотолюбительщина Пока слова не сказаны - ничего нет. Но если они сказаны, даже то чего нет становится реальностью. |
|
|
|
|
# 9 |
|
Junior Member
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96
![]() ![]() |
ЧересЧеловек:
В общем, можно написать примерно так: Код:
#include <iostream.h>
main()
{double y=0.8, x=0.5 ;
for( ;0.001<fabs(y-x); x+=0.1) cout<<x<<" ";}
__________________
1 миллибайт = 1/1024 байта |
|
|
|
|
# 10 |
|
Newbie
Регистрация: 29.03.2003
Сообщения: 22
![]() |
Можно я тоже пару слов вставлю, может и не совсем в тему, потому как про округление уже всё сказанно.
Дело в том, что при использовании "cout <<" вывод результатов проишодит не сразу. Когда - это будет опрделено самой системой. Что бы избежать подобной нериятности испольсуете <<endl; или что нибудь в этом роде. |
|
|