2014 dxdy logo

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

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




 
 Как же задать точность.
Сообщение28.04.2014, 12:17 
Возможно ли реализовать такую идею, где мы можем заранее указать точность.
Компилятор естественно выдает ошибку.

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

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

 
 
 
 Re: Как же задать точность.
Сообщение28.04.2014, 13:31 
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 
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 
Ну, можно написать шаблон или constexpr-функцию (C++11), если хочется в compile-time получить по целому значению delta вещественное epsilon. Вот только зачем?

 
 
 
 Re: Как же задать точность.
Сообщение06.05.2014, 22:27 
Аватара пользователя
Можно так:
Используется синтаксис 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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group