LINUX.ORG.RU

Сообщения fsb4000

 

Немного слов про умные компиляторы

Что в этом коде не так? https://godbolt.org/g/E3rfoq Почему компилятор 2017 года, с опциями максимальной скорости и с поддержкой инструкций AVX2 не видит, что сумму можно посчитать используя SIMD?

Вот пример ассемблерного кода, который в 3 раза более быстрый чем сгенерированный компилятором, и это лишь используя mmx инструкции. https://pastebin.com/b1yiSwNx

 , ,

fsb4000
()

Как объединить шаблоны и наследование

Попросили решить, но я не знаю как :(

Спасибо тому, кто подскажет идею.

Есть main.cpp, нужно чтобы он работал:

#include "quadrature.h"

#include <cmath>
#include <iostream>
#include <memory>
#include <string>

int main() {
    using F = decltype(cos);

    std::string input;
    std::cin >> input;
    std::unique_ptr<IntegrationMethod<F>> method;
    if (input == "rectangle")
        method.reset(new RectangleRule<F>);
    else
        method.reset(new TrapezoidalRule<F>);

    double x, y;
    std::cin >> x >> y;

    int n;
    std::cin >> n;

    std::cout << method->Integrate(cos, x, y, n) << "\n";
    std::cout << method->Integrate(sin, x, y, n) << "\n";
}

Я не знаю как именно реализовать три недостающих класса. Вот мой вариант, я знаю что он не правильный и не компилируется:

#ifndef __QUADRATURE_H__
#define __QUADRATURE_H__

template <typename F>
class IntegrationMethod
{
public:
	virtual double Integrate(F func, double x, double y, int n)
	{
		return 0;
	}
protected:
};

template <typename F>
class RectangleRule : public IntegrationMethod<F>
{
public:
	double Intergrate (F func, double x, double y, int n) override
	{
	    double value = 0;
		double step = (y - x)/n;
	    for (double i = x+step/2; i < y; i += step)
	    {
	        value += func(i);
	    }
	    value *= step;
	    return value;
	}
};

template <typename F>
class TrapezoidalRule : public IntegrationMethod<F>
{
public:
	double Intergrate (F func, double x, double y, int n) override
	{
	    double value = 0;
		double step = (y - x)/n;
	    for (double i = x; i < y; i += step)
	    {
	        value += func(i);
	    }
	    value *= step;
	    return value;
	}
};
#endif

 ,

fsb4000
()

Ищу удаленную работу программистом С или С++

Ищу удаленную работу программистом С или С++

Знаю:

С++: C++14, многие библиотеки boost, Qt5 Widgets, Google Test, Qt Test

C: C99, Posix C, OpenMP 2.0, Unity

системы сборки: make, qmake

контроль версий: git

статические анализаторы: clang-tidy, cppcheck

Контакты:

Игорь, fsb4000@yandex.ru , skype: fsb4000

 ,

fsb4000
()

RSS подписка на новые темы