Войти
ПрограммированиеФорумОбщее

Прозрачность кода в C++ (3 стр)

Страницы: 1 2 3 4 521 Следующая »
#30
19:39, 27 июня 2009

О. Федор
И что ты этим хотел показать? Где код который написал за меня компилятор? Если ты хочешь приплести сюда то, что шаблон это и есть код который за меня написал компилятор, то както мимо...


#31
19:39, 27 июня 2009

>>О. Федор
>>Твой результат будет отличаться от реального (100000000) в 6 раз. Проверь

>>ashujon
>>результат будет не точным из-за метода кодировки float, но он не загнется

#32
19:39, 27 июня 2009

Там проблема из-за потери точности в результате округления.

#33
19:41, 27 июня 2009

Executor
> И что ты этим хотел показать? Где код который написал за меня компилятор? Если
> ты хочешь приплести сюда то, что шаблон это и есть код который за меня написал
> компилятор, то както мимо...

Я хотел этим показать, что эта проблема в лоб не решается. Но ее можно решить с помощью шаблонов.

#34
19:42, 27 июня 2009

О. Федор
> Я хотел этим показать, что эта проблема в лоб не решается. Но ее можно решить с
> помощью шаблонов.

Какая проблема? Чот не догнал... Округление?

#35
19:42, 27 июня 2009

>>О. Федор
>>Ты проверял этот код? Он загнется на первом миллионе.

что в этом контексте значило слово "загнется"?

#36
19:45, 27 июня 2009

Фактически идея состоит в том, что суммирование нужно производить по формуле

sum = (((a[0]+a[1]) + (a[2]+a[3])) + ((a[4]+a[5]) + (a[6]+a[7]))) +...

В ручную такое писать несколько утомительно для 100000000 членов, но компилятор может это сделать за вас.

#37
19:46, 27 июня 2009

ashujon
> что в этом контексте значило слово "загнется"?

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

#38
19:47, 27 июня 2009

Executor
> Какая проблема? Чот не догнал... Округление?

Да, именно.

#39
19:48, 27 июня 2009

ну это очевидно, так бы и писал, а то я уж подумал что говоришь будто цикл прекратится ошибкой на середине o_O

#40
19:53, 27 июня 2009

ashujon
> ну это очевидно, так бы и писал, а то я уж подумал что говоришь будто цикл
> прекратится ошибкой на середине o_O

А то, что сумма по твоей проге перестает расти начиная с i=16666666 это как бы ничего?

#41
19:57, 27 июня 2009

32 бита не бесконечны, нельзя хранить точность и большое число одновремено, то что оно округляется это естествено
да и проблема чисто гипотетическая, 100000000 флотов что нужно сложить не каждый день встретиш

мой пример был нацелен на то чтобы доказать что с циклом все будет в порядке, а не с числом, про число я ниже сделал заметку сразу

#42
20:18, 27 июня 2009

Что-то я поинта не понимаю примера с суммой.

Если числа примерно одинаковые, то учебники советуют вот так, в лоб:

float Sum( float *ptr, size_t size )
{  
  if( size < 16 )
  {
    float result = 0.0f;
    for( size_t i = 0; i < size; ++i )
    {
      result += ptr[i];
    }
    return result;
  }
  
  size_t halfSize = size / 2;
  return Sum( ptr, halfSize ) + Sum( ptr + halfSize, size - halfSize );
}

Но скорее всего в продакшне предпочтение отдадут:

double result = 0.0f;
for( size_t i = 0; i < size; ++i )
{
  result += ptr[i];
}

без всяких шаблонов и прочего, без выноса в отдельную функцию.

#43
20:28, 27 июня 2009

Я чет нипонял, вы float умножаете???

#44
20:29, 27 июня 2009

О. Федор
Не понял примера с суммой. Где за меня пишет компилятор? Если ты про неточность флоата, то это неточность флоата.
> sum = (((a[0]+a[1]) + (a[2]+a[3])) + ((a[4]+a[5]) + (a[6]+a[7]))) +...

float sum = 0.0f, sumNext = 0.0f, e = 0.0f;
int i;
for (i = 0; e = getNextNumber(); i++) {
  sumNext += e;
  if (i && i % 2) {
    sum += sumNext;
    sumNext = 0.0f;
  }
}
Код не тестировал.

*Ушел на C, ибо ни шаблоны, ни классы мне не нужны и только мешают писать рабочий код, зато заставляют рождать один за одним новые сущности.

Страницы: 1 2 3 4 521 Следующая »
ПрограммированиеФорумОбщее