2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как же задать точность.
Сообщение28.04.2014, 12:17 


18/04/14
157
sbp
Возможно ли реализовать такую идею, где мы можем заранее указать точность.
Компилятор естественно выдает ошибку.

Вариант с делением 1 на 10 шесть раз не предлагать.

Используется синтаксис C++
double const delta = 6;
double eps(1E-delta); // имеется в виду eps(1E-6)
 

 Профиль  
                  
 
 Re: Как же задать точность.
Сообщение28.04.2014, 13:31 
Заслуженный участник


27/04/09
28128
Katmandu в сообщении #856217 писал(а):
Вариант с делением 1 на 10 шесть раз не предлагать.
А три раза?

А ещё есть ведь функции возведения в степень…

-- Пн апр 28, 2014 16:36:40 --

Поясню про три раза: 1 / 10 / 10 / 10 / 10 / 10 / 10, действительно, неразумно, и даже 0.1 * 0.1 * 0.1 * 0.1 * 0.1 * 0.1 нехорошо, потому что можно сначала найти 1e-2 = 0.1 * 0.1, потом ещё 1e-4 = 1e-2 * 1e-2, и потом 1e-6 = 1e-2 * 1e-4. Это всемирно известный алгоритм возведения в степень $n$ за $O(\log n)$.

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

 Профиль  
                  
 
 Re: Как же задать точность.
Сообщение28.04.2014, 14:31 
Заслуженный участник


15/05/05
3445
USA
Katmandu в сообщении #856217 писал(а):
Возможно ли реализовать такую идею, где мы можем заранее указать точность.
Используется синтаксис C++
double const delta = 6;
double eps(1E-delta); // имеется в виду eps(1E-6)
 

А так не подойдет?
Используется синтаксис C++
double const eps = 1E-6;
 

 Профиль  
                  
 
 Re: Как же задать точность.
Сообщение28.04.2014, 17:29 
Заслуженный участник


28/04/09
1933
Ну, можно написать шаблон или constexpr-функцию (C++11), если хочется в compile-time получить по целому значению delta вещественное epsilon. Вот только зачем?

 Профиль  
                  
 
 Re: Как же задать точность.
Сообщение06.05.2014, 22:27 
Заслуженный участник
Аватара пользователя


28/07/09
1238
Можно так:
Используется синтаксис C
#include <stdio.h>

#define DELTA 6
#define dummy(X, Y) X ## E ## - ## Y
#define make_eps(X, Y) dummy(X, Y)

int main()
{
    double x=make_eps(1, DELTA);
    printf("%g\n", x);
    return 0;
}
Почему нельзя заменить "вызов" третьего «ненужного» дефайна сразу вторым? Ответ в K&R A.12.3
Кто сможет упростить/переделать способ именно через #define - буду очень благодарен, если сообщите, как.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group