Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> операции с double типами в compile-time 
V
    Опции темы
boostcoder
Дата 28.12.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



есть интерес, наваять compile-time библиотеку для работы с типами с плавающей точкой. но тут встает проблема невозможности специализации шаблонов значениями типа double.
т.е. такой пример компилиться не будет:
Код

template<double V>
struct type {
   double value = V*3.14;
};

int main() {
   double v = type<1.7>::value;
}


http://liveworkspace.org/code/86e039b8f370...78ff61149dee226

кто-то задумывался над решением подобной задачи?
как вариант, вместо double типа создать шаблон complex<int, int>

в общем, интересует мнение более знающих в этом вопросе.

Добавлено через 8 минут и 18 секунд
еще непонятно, каким образом при использовании complex для целых, передать значение 1.0059

Добавлено через 8 минут и 57 секунд
либо это должен быть не complex, а шаблон с переменным числом значений типа char
PM WWW   Вверх
mes
Дата 28.12.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  28.12.2011,  14:12 Найти цитируемый пост)
 но тут встает проблема невозможности специализации шаблонов значениями типа double.

 а зачем шаблоны для даблов то ?! чтоб что получить ?


Цитата(boostcoder @  28.12.2011,  14:12 Найти цитируемый пост)
 библиотеку для работы с типами с плавающей точкой.

может так  ? :
Код

constexpr double pi = 3.14;
constexpr double my_double  = 1.0059 *pi;



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 28.12.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот еще что на хабре нашел: http://habrahabr.ru/blogs/cpp/124963/
вот в виде компилябильного примера: http://liveworkspace.org/code/fcc2d54c4a0a...27bf73de5c42fd5

Цитата(mes @  28.12.2011,  16:54 Найти цитируемый пост)
а зачем шаблоны для даблов то ?! чтоб что получить ?

к примеру, реализацию банального sqrt() ;)

PM WWW   Вверх
boostcoder
Дата 28.12.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes,  хотя да, constexpr в большинстве случаев решает проблему.
PM WWW   Вверх
newbee
Дата 28.12.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



AFAIK оптимизирующий компилятор и без constexpr вычислит практически все, что можно, во время компиляции.

Добавлено через 1 минуту и 15 секунд
Не перестаю удивляться бусткодеру, вечно пытающемуся усложнить себе жизнь )


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 28.12.2011, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  28.12.2011,  21:05 Найти цитируемый пост)
оптимизирующий компилятор и без constexpr вычислит практически все, что можно, во время компиляции

реализация функции sqrt() компилятору недоступна. как и большинство других ;)

Цитата(newbee @  28.12.2011,  21:05 Найти цитируемый пост)
вечно пытающемуся усложнить себе жизнь

###кожу я на пайтоне. а на с++ реализую "сложные" и интересные задачи.
PM WWW   Вверх
newbee
Дата 28.12.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  28.12.2011,  22:40 Найти цитируемый пост)
реализация функции sqrt() компилятору недоступна. как и большинство других ;)
Ммм, наверное ты прав. А теперь попробуем поразмыслить, сколько в программе в процентном соотношении вычислений с заведомо известными аргументами относительно всех вычислений? Даже если ты много-много раз вызываешь функцию, в которой каждый раз вычисляется sqrt(42), намного понятней для человека, читающего код, будет вынесение этого вычисления в статическую переменную функции вместо магического шаблона. Просто дико бесит читать код, автор которого пытался выеживаться что есть сил, дабы написать простую вещь сложными словами...

Цитата(boostcoder @  28.12.2011,  22:40 Найти цитируемый пост)
###кожу я на пайтоне
Вот как чувствовала, сейчас годость какую-нибудь напишешь ;) фу на тебя)

Добавлено через 3 минуты и 24 секунды
Цитата(newbee @  28.12.2011,  22:58 Найти цитируемый пост)
 читать код, автор которого пытался выеживаться что есть сил, дабы написать простую вещь сложными словами...
Это кстати присуще многим молодым неопытным программистам, я сама за собой такое замечала.. Хочется сделать сложно, чтобы почувствовать свою крутость ) Но ты то, смотри, зазубрил буст с шаблонами, на это несколько лет ушло точно, три, может даже больше.. Поди не маленький уже )


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 28.12.2011, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  28.12.2011,  21:58 Найти цитируемый пост)
 дико бесит читать код, автор которого пытался выеживаться что есть сил

 smile 
возможно, стиль такой..

Цитата(newbee @  28.12.2011,  21:58 Найти цитируемый пост)
намного понятней для человека, читающего код, будет вынесение этого вычисления в статическую переменную функции вместо магического шаблона

если шаблон зовется sqrt() и используется он как sqrt(42), то что же тут непонятного?
никто же не заставляет зубрить его реализацию. но хорошо что она есть, и если интересно, то есть что зазубрить ;)

Цитата(newbee @  28.12.2011,  21:58 Найти цитируемый пост)
сейчас годость какую-нибудь напишешь

это только так кажется. но такова суровая реальность. предпочитаю банальные задачи писать на пайтоне. понятней некуда ;)

Добавлено @ 22:06
Цитата(newbee @  28.12.2011,  21:58 Найти цитируемый пост)
Поди не маленький уже

эм.. относительно кого? smile

Добавлено через 8 минут и 18 секунд
Цитата(newbee @  28.12.2011,  21:58 Найти цитируемый пост)
три, может даже больше

не-не-не! он того не стОит smile 

Это сообщение отредактировал(а) boostcoder - 28.12.2011, 22:07
PM WWW   Вверх
boostcoder
Дата 29.12.2011, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



собственно вот реализация компайл-тайм sqrt() без единого шаблона.
Код

#include <iostream>
#include <cmath>

constexpr double my_sqrt_impl(double lower, double upper, double v, bool d) {
   return upper-lower>0.000000000001
      ? ((lower+upper)/2)*((lower+upper)/2)>v
         ? my_sqrt_impl(lower, (lower+upper)/2, v, d)
         : my_sqrt_impl((lower+upper)/2, upper, v, d)
      : d?lower:upper
   ;
}

constexpr double my_sqrt(double v) {
   return (my_sqrt_impl(v<1?v:1, v<1?1:v, v, true)
          +my_sqrt_impl(v<1?v:1, v<1?1:v, v, false)
   )/2;
}

int main() {
   constexpr double v = 1.00006;

   std::cout << "standard implementation: " << sqrt(v) << std::endl;
   std::cout << "my own   implementation: " << my_sqrt(v) << std::endl;

   char array[int(my_sqrt(v))]; // check if my_sqrt(v) is constant expression
   std::cout << sizeof(array) << std::endl;
}


http://liveworkspace.org/code/c12e6d1eb1fb...9639a14662ab727

будут предложения по улучшению?

Добавлено через 2 минуты и 13 секунд
хм.. не понимаю как в этот код добавить проверку на nan аргумент %)
PM WWW   Вверх
mes
Дата 29.12.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  29.12.2011,  09:32 Найти цитируемый пост)
хм.. не понимаю как в этот код добавить проверку на nan аргумент %) 

всмысле, что именно не понятно ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 29.12.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, это я опять в дебри какие-то себя затащил smile
Код

#include <iostream>
#include <cmath>
#include <limits>

constexpr double my_sqrt_impl(double lower, double upper, double v, bool d) {
   return upper-lower>0.000000000001
   ? ((lower+upper)/2)*((lower+upper)/2)>v
      ? my_sqrt_impl(lower, (lower+upper)/2, v, d)
      : my_sqrt_impl((lower+upper)/2, upper, v, d)
   : d?lower:upper;
}

constexpr double my_sqrt(double v) {
   return v>0
   ? (my_sqrt_impl(v<1?v:1, v<1?1:v, v, true)
     +my_sqrt_impl(v<1?v:1, v<1?1:v, v, false))/2
   :-std::numeric_limits<double>::quiet_NaN();
}

int main() {
   constexpr double v = -1.00006;

   std::cout << "standard implementation: " << sqrt(v) << std::endl;
   std::cout << "my own   implementation: " << my_sqrt(v) << std::endl;

   char array[int(my_sqrt(v))]; // check if my_sqrt(v) is constant expression
   std::cout << sizeof(array) << std::endl;
}


http://liveworkspace.org/code/68e77aa2c260...81d11ac4313f7c4
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.