imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 18.11.2005, 21:52     # 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++
Не дайте сойти с ума,укажите где я налошил?
 
Старый 18.11.2005, 21:57     # 2
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
так все правильно, условие-то x<y, а когда x (при y=0.7) получается 0.7, то соответственно 0.7<0.7 - неверное неравенство, так что меняй условие на x<=y...
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 18.11.2005, 22:28     # 3
ЧересЧеловек
Guest
 
Сообщения: n/a

Что прально? При 0.8 выводит 4 значения, при 0.7 только 2.
 
Старый 18.11.2005, 22:32     # 4
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
сделай начальный x например 0.51, я думаю баги с округлением идут в Си...
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 18.11.2005, 22:36     # 5
ЧересЧеловек
Guest
 
Сообщения: n/a

Да мне не пример решить надо. с этим я и сам разберусь. мне понять где што не так. что значит за баги с округлением? в трех разным компиляторах? Так чему верить то тогда? каждую строчку тестить?
 
Старый 18.11.2005, 22:53     # 6
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
ЧересЧеловек, тебе ведь дали наводку...

Невозможно _точно_ представить флоат/дабл в двоичном виде - всегда будет погрешность. например, выполнение такого кода совершенно не гарантируется:

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.
BorLase вне форума  
Старый 18.11.2005, 23:49     # 7
ЧересЧеловек
Guest
 
Сообщения: n/a

дело было не в бабине...
 
Старый 19.11.2005, 00:03     # 8
Dimm
Добрый фей-мод
 
Аватар для Dimm
 
Регистрация: 18.09.2002
Адрес: Израиль
Пол: Male
Сообщения: 4 155

Dimm СуперБогDimm СуперБог
Dimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБогDimm СуперБог
ЧересЧеловек
Все верно сказано. Даже если ты напишешь y= 0.8, это может оказаться 0.8000000000000001.

поэтому либо сам округляй, либо пользуйся специальными функциями сравнения флоат/дабл. Такие есть во многих библиотеках.
__________________
Фотолюбительщина

Пока слова не сказаны - ничего нет. Но если они сказаны, даже то чего нет становится реальностью.
Dimm вне форума  
Старый 21.11.2005, 10:13     # 9
LightImage
Junior Member
 
Регистрация: 16.10.2002
Адрес: Россия-матушка
Пол: Male
Сообщения: 96

LightImage Нимб уже пробиваетсяLightImage Нимб уже пробивается
ЧересЧеловек:
В общем, можно написать примерно так:
Код:
#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 байта
LightImage вне форума  
Старый 22.11.2005, 13:19     # 10
KapMaH
Newbie
 
Аватар для KapMaH
 
Регистрация: 29.03.2003
Сообщения: 22

KapMaH Путь к славе только начался
Можно я тоже пару слов вставлю, может и не совсем в тему, потому как про округление уже всё сказанно.
Дело в том, что при использовании "cout <<" вывод результатов проишодит не сразу. Когда - это будет опрделено самой системой. Что бы избежать подобной нериятности испольсуете <<endl; или что нибудь в этом роде.
KapMaH вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 13:33.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.