IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   туплю с for() на С (https://www.imho.ws/showthread.php?t=96112)

ЧересЧеловек 18.11.2005 21:52

туплю с 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++
Не дайте сойти с ума,укажите где я налошил?

Naked 18.11.2005 21:57

так все правильно, условие-то x<y, а когда x (при y=0.7) получается 0.7, то соответственно 0.7<0.7 - неверное неравенство, так что меняй условие на x<=y...

ЧересЧеловек 18.11.2005 22:28

Что прально? При 0.8 выводит 4 значения, при 0.7 только 2.

Naked 18.11.2005 22:32

сделай начальный x например 0.51, я думаю баги с округлением идут в Си...

ЧересЧеловек 18.11.2005 22:36

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

BorLase 18.11.2005 22:53

ЧересЧеловек, тебе ведь дали наводку...

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

if( 5.9999 + 0.0001 == 6.0 ) ***;

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

у тебя же - классический случай, когда 0,7+0,1 != 0,8

иллюстрация примерно такая -
0,7 - 0000000000011111111111100
0,1 - 0000000000000000000000001
0,8 - 0000000000100000000000000
думаю, смысл понятен

ЧересЧеловек 18.11.2005 23:49

дело было не в бабине...

Dimm 19.11.2005 00:03

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

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

LightImage 21.11.2005 10:13

ЧересЧеловек:
В общем, можно написать примерно так:
Код:

#include <iostream.h>
main()
{double y=0.8, x=0.5 ;
for( ;0.001<fabs(y-x); x+=0.1) cout<<x<<" ";}


KapMaH 22.11.2005 13:19

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


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

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