![]() |
туплю с 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++ Не дайте сойти с ума,укажите где я налошил? |
так все правильно, условие-то x<y, а когда x (при y=0.7) получается 0.7, то соответственно 0.7<0.7 - неверное неравенство, так что меняй условие на x<=y...
|
Что прально? При 0.8 выводит 4 значения, при 0.7 только 2.
|
сделай начальный x например 0.51, я думаю баги с округлением идут в Си...
|
Да мне не пример решить надо. с этим я и сам разберусь. мне понять где што не так. что значит за баги с округлением? в трех разным компиляторах? Так чему верить то тогда? каждую строчку тестить?
|
ЧересЧеловек, тебе ведь дали наводку...
Невозможно _точно_ представить флоат/дабл в двоичном виде - всегда будет погрешность. например, выполнение такого кода совершенно не гарантируется: if( 5.9999 + 0.0001 == 6.0 ) ***; на эту тему обычно можно почитать в любой литературе по С рангом чуть выше, чем "С++ за 12 дней" - там же даются и советы, как обойти возможные глюки типа твоего. у тебя же - классический случай, когда 0,7+0,1 != 0,8 иллюстрация примерно такая - 0,7 - 0000000000011111111111100 0,1 - 0000000000000000000000001 0,8 - 0000000000100000000000000 думаю, смысл понятен |
дело было не в бабине...
|
ЧересЧеловек
Все верно сказано. Даже если ты напишешь y= 0.8, это может оказаться 0.8000000000000001. поэтому либо сам округляй, либо пользуйся специальными функциями сравнения флоат/дабл. Такие есть во многих библиотеках. |
ЧересЧеловек:
В общем, можно написать примерно так: Код:
#include <iostream.h> |
Можно я тоже пару слов вставлю, может и не совсем в тему, потому как про округление уже всё сказанно.
Дело в том, что при использовании "cout <<" вывод результатов проишодит не сразу. Когда - это будет опрделено самой системой. Что бы избежать подобной нериятности испольсуете <<endl; или что нибудь в этом роде. |
| Часовой пояс GMT +4, время: 13:33. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.