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

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

Страницы: 13 4 5 621 Следующая »
#45
20:37, 27 июня 2009
#include <algorithm>
#include <numeric>
#include <iostream>

const unsigned size = 100000000;
float f[size];

int main()
{
  std::fill (f, f+size, 0.001);
  std::cout << std::accumulate (f, f+size, 0.0) << std::endl;
  return 0;
}

пойнта в данной задачке тоже не наблюдаю % )


#46
21:50, 27 июня 2009

IronPeter
> Что-то я поинта не понимаю примера с суммой.
> Если числа примерно одинаковые, то учебники советуют вот так, в лоб:

Можно сделать иеархически, да. Но твой первый пример работать не будет.

> Но скорее всего в продакшне предпочтение отдадут:
> double result = 0.0f;
> без всяких шаблонов и прочего, без выноса в отдельную функцию.

Вводная была без double, только float.
Смысл? Совершенно практический. В CUDA (да, опять!) на девайсе до g200 не было поддержки double, да и сейчас float работает раз в 8 быстрее.

Fla
> Не понял примера с суммой. Где за меня пишет компилятор? Если ты про неточность
> флоата, то это неточность флоата.

Можно и как ты сделал, можно и с вложенными циклами, но внутри каждого цикла суммировать в свою переменную.
Кстати, рабочего примера, как это надо делать с шаблонами, я еще не показывал и только собираюсь это сделать.

#47
21:53, 27 июня 2009

Sh.Tac.

Как внутри устроен  std::accumulate я не знаю; может быть с шаблонами, а может использует для накопления переменнную с достаточной для представления числа точностью. Это возможно.
Но это не решение задачи, поскольку такм где это надо использовать нет stl.

#48
21:57, 27 июня 2009

>Но твой первый пример работать не будет

Почему?

#49
22:06, 27 июня 2009

О. Федор

А какое имеет отношение сложение чисел к прозрачности кода?

#50
22:11, 27 июня 2009

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

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

> Но это не решение задачи, поскольку такм где это надо использовать нет stl.

STL это вроде как стандарт Си++, как его может не быть?

#51
22:28, 27 июня 2009

Ghost2
> А какое имеет отношение сложение чисел к прозрачности кода?

Речь зашла о пользе шаблонов и о том, как заставить компилятор работать вместо себя.

Executor
> Только не ясно для чего ты собираешься это показывать, лично я вроде против
> шаблонов как таковых не был...

Не сомневаюсь.

> STL это вроде как стандарт Си++, как его может не быть?

Разумеется. Но бывают ситуации когда приходится обходится без него.

#52
22:30, 27 июня 2009

О. Федор

> Речь зашла о пользе шаблонов и о том, как заставить компилятор работать вместо себя.
Что компилятор знает о моих числах?

#53
22:32, 27 июня 2009

Теперь обещанный код для суммирования большого ряда чисел с использованием только float представления

template <int shiff>
struct Summa
{
  static float sum2(float *a, int i, int n)
  {
    int shiff_ = shiff;
    float sum = 0;
    if (i<n)
    {
        sum += Summa<shiff/2>::sum2(a, i, n);
      if (i + shiff < n)
        sum += Summa<shiff/2>::sum2(a, i + shiff, n);
    }
    return sum;
  }
};

template <>
struct Summa<1>
{
  static float sum2(float *a, int i, int n)
  {
    float sum = 0;
    if (i<n)
    {
      sum += a[i];
      if (i + 1 < n)
        sum += a[i+1];
    }
    return sum;
  }
};

//Вызывается так

float summ = Summa<67108864>::sum2(a, 0, n);      //Здесь 67108864 степень 2 меньше n
#54
22:33, 27 июня 2009

Ghost2
> Что компилятор знает о моих числах?

Он знает, что они float.

#55
22:52, 27 июня 2009

IronPeter
> > о твой первый пример работать не будет
>
> Почему?

Извиняюсь. У тебя рабочий код.
Невнимательно посмотрел. Ты используешь рекурсивный вызов функции.
В принципе как и я, но у тебя это делается динамически. Я тоже хотел нечто подобное написать, но предподчел шаблоны, поскольку в CUDA рекурсии функций не поддерживаются.

#56
23:01, 27 июня 2009

О. Федор

Весь прикол шаблонов тут, насколько я понял, в Summa<1>?

#57
23:04, 27 июня 2009

О. Федор

> Невнимательно посмотрел. Ты используешь рекурсивный вызов функции.
Так где тут прозрачность кода? Вариант IronPeter мне стал понятен намного быстрее твоего.

#58
23:09, 27 июня 2009

Ghost2
> Весь прикол шаблонов тут, насколько я понял, в Summa<1>?

Тут ничего особеного нет и ты это знаешь.
Это всего лишь маленкий пример насколько они могут быть полезными.
Кстати, я из чисто спортивного интереса, проверил сколько элементов можно суммировать таким образом: n порядкак 3 миллиардов.

#59
23:10, 27 июня 2009

Ghost2
> Так где тут прозрачность кода? Вариант IronPeter мне стал понятен намного
> быстрее твоего.

Да, он лучше понятен. Но у него есть два недостатка:
- он медленнее
- его нельзи использовать на девайсе Cuda.

Страницы: 13 4 5 621 Следующая »
ПрограммированиеФорумОбщее