powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / счетчик в цикле типа double
17 сообщений из 17, страница 1 из 1
счетчик в цикле типа double
    #33568746
zal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
zal
Гость
Если в C++ Builder 6.0 скомпилить программу с таким циклом:
Код: plaintext
1.
2.
3.
double x;
for(x= 0 . 5 ;x<= 1 . 0 ;x+= 0 . 01 ) {
...}
то почему-то последний шаг (при x=1.0) не будет выполнен.
Но в цикле
Код: plaintext
1.
for(x= 0 . 5 ;x<= 1 . 0 ;x+= 0 . 1 )
все шаги выполняются.
Может кто-нибудь объяснить почему и можно ли как-нибудь этого избежать?
Заранее спасибо
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33568760
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalто почему-то последний шаг (при x=1.0) не будет выполнен.
Потому что не надо использовать для счетчика плавающий тип!
При операциях с плавающими типами существует погрешность (обычно в размере единицы последнего разряда).
т.е. в цикле
Код: plaintext
1.
double x;
for(x= 0 . 5 ;x<= 1 . 0 ;x+= 0 . 01 )
х, возможно, никогда не будет равен 1, а будет равен, например, 1.000...001 или 0.999...999
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33568766
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zaldouble x;
for(x=0.5;x<=1.0;x+=0.01)дабл весьма неточный тип
Код: plaintext
for(int x= 50 ;x<= 100 ;x+= 1 ) {}

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33569346
sraider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабасдабл весьма неточный тип
он весьма точный ;) просто он двоичный, а не десятичный.
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33569604
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sraider Карабас Барабасдабл весьма неточный тип
он весьма точный ;) просто он двоичный, а не десятичный.

Вы хоть понимаете о чем идет речь ? double - НЕТОЧНЫЙ по определению
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33569910
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда уже запретят применять = <= >= с числами с плавающей точкой ?
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33569944
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКогда уже запретят применять = <= >= с числами с плавающей точкой ?Не вижу ничего криминального, если понимать, что делаешь :)
А вобще, компилятор мог бы и варнинг выдавать в таких случаях
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33574540
sraider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Вы хоть понимаете о чем идет речь ? double - НЕТОЧНЫЙ по определению

Я весьма понимаю о чем идет речь. А Вы представляете как хранятся числа в double?

Что значит "неточный по определению"? покажите мне такое определение...
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33574570
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sraiderЧто значит "неточный по определению"? покажите мне такое определение...о чем ты споришь ???
ну напиши вот это:
Код: plaintext
1.
2.
3.
  int c= 0 ,c2= 0 ;
  for(double i= 0 . 0001 ;i<= 0 . 0010 ;i+= 0 . 00002 ) c++;
  for(int d= 10 ;d<= 100 ;d+= 2 ) c2++;
и сравни результаты, а потом уже говори о точности.

PS: неточно хранится !
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33574685
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасPS: неточно хранится !
я бы сказал, неточно выполняются операции, в т.ч. преобразования в/из другие системы счисления.
например, 0.1 нельзя точно преобразовать в тип double, т.к. получается бесконечная дробь и невлезающая часть будет просто отброшена.
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33574719
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftя бы сказал, неточно выполняются операции, в т.ч. преобразования в/из другие системы счисленияда, так будет точнее :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33574753
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
паняслась

sraiderЯ весьма понимаю о чем идет речь. А Вы представляете как хранятся числа в double?


да ЗНАЮ (а не представляю), но оглашать здесь ...
не до сук
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33578413
sraider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас sraiderЧто значит "неточный по определению"? покажите мне такое определение...о чем ты споришь ???
ну напиши вот это:
Код: plaintext
1.
2.
3.
  int c= 0 ,c2= 0 ;
  for(double i= 0 . 0001 ;i<= 0 . 0010 ;i+= 0 . 00002 ) c++;
  for(int d= 10 ;d<= 100 ;d+= 2 ) c2++;
и сравни результаты, а потом уже говори о точности.

PS: неточно хранится !
Posted via ActualForum NNTP Server 1.3

Ты бы еще число Pi в тип int попытался запихнуть и сказал что оно там неточно хранится :) Так и здесь - пытаешься число 0.0001 (которое не раскладывается по степеням двойки) запихнуть в двоичный дробный тип. Все равно что 1/3 попробовать записать десятичной дробью - десятичных разрядов не хватит.

Попробуй прогнать свой цикл с числами типа 0.5, 0.25, 0.75 или 0.125 - все будет точно, так как они раскладываются по степеням двойки.
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33578603
_shumer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И о чем вы спорите? Обо всем, только не по существу.
zal , в таких случаях просто не используй операцию <=
Проще всего твоя проблема решается так
Код: plaintext
1.
2.
double x;
for(x= 0 . 5 ;x< 1 . 01 ;x+= 0 . 01 ) 
  cout<<x<<endl;

И это будет верно для любого приращения переменной цикла в рамках типа double, если это приращение не будет превышать погрешность.

Эмпирическим путем получил, что еще при приращении 10^-13 работает, при 10^-14 уже нет.

Почему так?
Ответ кроется в реализации представления чисел с плавающей точкой. Никто не мешает тебе создать к примеру свой класс, обрабатывающий многобайтные числа, и таким образом увеличить точность вычислений до необходимой.
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33578712
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sraiderПопробуй прогнать свой цикл с числами типа 0.5, 0.25, 0.75 или 0.125 - все будет точно, так как они раскладываются по степеням двойки.Ты МНЕ это говоришь ? Хе-хе топик читал, или так, вырвал кусок ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33578838
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sraiderПопробуй прогнать свой цикл с числами типа 0.5, 0.25, 0.75 или 0.125 - все будет точно, так как они раскладываются по степеням двойки.

Вот уж точно, computation skill сюда не хочешь за $4000 ?
Помедитируй над этим:

1E100-1

внимательно, а потом скажи, уж не происходит ли здесь ПОТЕРЯ ТОЧНОСТИ ???

В качестве дополнительного задания, ответь скока раз отработает цикл:

for (double i=1e100;i>0;i=i-1);
...
Рейтинг: 0 / 0
счетчик в цикле типа double
    #33579892
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь как раз модератор и нужен.:) Достал этот топик гз. С математикой что ли сложно?
MSDN
Double precision values with double type have 8 bytes. The format is similar to the float format except that it has an 11-bit excess-1023 exponent and a 52-bit mantissa, plus the implied high-order 1 bit. This format gives a range of approximately 1.7E–308 to 1.7E+308 for type double.

Microsoft Specific —>

The double type contains 64 bits: 1 for sign, 11 for the exponent, and 52 for the mantissa. Its range is +/–1.7E308 with at least 15 digits of precision.

END Microsoft Specific

END Microsoft Specific
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / счетчик в цикле типа double
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]