Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 32
1

Минимально возможное изменение вещественного числа

03.08.2015, 02:41. Показов 1783. Ответов 8
Метки нет (Все метки)

Как я понимаю, для этого необходимо добавить (отнять) минимально возможную степень двойки, которое изменит это число. Вопрос: как эффективней это запрограммировать (в смысле быстрейшего нахождения такой добавки). В интеловском компиляторе использую опцию /fprecise.

P.S.
Наверное этот вопрос уже обсуждался, но ответа я не нашел.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2015, 02:41
Ответы с готовыми решениями:

Требуется вычеркнуть минимально возможное количество чисел так, чтобы оставшиеся числа шли в порядке возрастания
27. Дана последовательность из N целых чисел, среди которых нет двух одинаковых. Требуется...

Определить минимально возможное количество игроков в команде КВН
Определить минимально возможное количество игроков в команде КВН, если известно, что девушек в...

Найти минимально возможное значение суммы налогов на пути из заданного города в столицу
здравствуйте. помогите, пожалуйста, с задачкой условие вкратце: Входные данные: Первая строка...

Определить минимально возможное количество мостов, которые необходимо задействовать при строительстве метрополитена
Помогите, пожалуйста #include <iostream> using namespace std; int main() { int...

8
Модератор
Эксперт С++
11480 / 9398 / 5649
Регистрация: 18.12.2011
Сообщений: 25,108
03.08.2015, 06:09 2
C++
1
2
3
4
5
6
7
8
double a,aold;
a=1.0;
while(a)
{
   aold=a;
   a/=2.0;
}
cout<<"Minimal double value="<<aold<<endl;
2
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 32
03.08.2015, 08:11  [ТС] 3
zss,

Спасибо, но когда я писал про эффективность, я имел в виду в первую очередь скорость кода, а не его минимальность. Дело в том, что у меня таких преобразований очень много и временные рамки не позволяют воспользоваться Вашим красивым и лаконичным кодом.
0
Эксперт С++
3210 / 1737 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
03.08.2015, 08:19 4
Лучший ответ Сообщение было отмечено George_ как решение

Решение

Расстояние между соседними действительными числами непостоянно и зависит от модуля числа. Оно равно
std::numeric_limits<double>::epsilon() * abs(double_num), но, разумеется, не меньше, чем std::numeric_limits<double>::min():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <cmath>
#include <iostream>
#include <limits>
#include <stdexcept>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    double  const   DOUBLE_MIN  =   std::numeric_limits<double>::min        ();
    double  const   DOUBLE_EPS  =   std::numeric_limits<double>::epsilon    ();
 
    for(;;)
    {
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  "Введите действительное число: ";
 
        T_str   d_str;
        std::cin    >>  d_str;
        double  d   =   0;
 
        try
        {
            d   =   stod( d_str );
        }
        catch( std::exception   &   e )
        {
            std::cout   <<  e.what()
                        <<  std::endl;
 
            continue;
        }
 
        auto    d_epsilon  =   std::max     (
                                                    DOUBLE_EPS
                                                *   abs( d ),
 
                                                DOUBLE_MIN
                                            );
 
        std::cout   <<  "d = "
                    <<  d
                    <<  std::endl
                    <<  "Расстояние до соседних действительных чисел: "
                    <<  d_epsilon
                    <<  std::endl;
 
        system("pause");
    }//for
}
1
Модератор
Эксперт С++
11480 / 9398 / 5649
Регистрация: 18.12.2011
Сообщений: 25,108
03.08.2015, 08:20 5
Цитата Сообщение от George_ Посмотреть сообщение
таких преобразований очень много
Так это надо сделать всего один раз и запомнить это число.
Кроме этого, есть соответствующие константы DBL_MIN DBL_EPSILON
в limits.h
1
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 32
03.08.2015, 09:02  [ТС] 6
Mr.X,

А Ваш код будет эффективным по времени: exception вроде "жрет" прилично время? Проверю и отпишусь.

zss,

Я, наверное, неудачно сформулировал свой вопрос, но Mr.X понял меня правильно. Еще раз спасибо.
0
Эксперт С++
3210 / 1737 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
03.08.2015, 09:14 7
Цитата Сообщение от George_ Посмотреть сообщение
А Ваш код будет эффективным по времени: exception вроде "жрет" прилично время? Проверю и отпишусь.
Ну, исключение здесь выбрасывается при неправильном вводе с клавиатуры. Если у вас изначально имеется число типа double, то и исключения не понадобятся.

Добавлено через 1 минуту
Так-то исключение жрет время, когда оно выбрасывается. В нормальном режиме ничего не жрет.
1
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 32
03.08.2015, 09:22  [ТС] 8
Mr.X,

понял Вас и проникся. При трансляции получил следующее:
E:\App>icl min_double.cpp
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Ve
rsion 15.0.4.221 Build 20150407
Copyright (C) 1985-2015 Intel Corporation. All rights reserved.

min_double.cpp
min_double.cpp(26): warning #583: C++ exception handler found but /EHsc option w
as not specified
try
^

min_double.cpp(38): error: namespace "std" has no member "max"
auto d_epsilon = std::max (
^

compilation aborted for min_double.cpp (code 2)
0
Эксперт С++
3210 / 1737 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
03.08.2015, 09:52 9
Цитата Сообщение от George_ Посмотреть сообщение
получил следующее
Ой, пардон, забыл <algorithm> включить.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2015, 09:52

Запись числа 256 в системе счисления с основанием N содержит 3 цифры и оканчивается на 4. Чему равно минимально возможное основание системы счисле
объясните решение

Минимально возможное расстройство
Добрый день, форумчане. Сижу над решением задачи больше недели и из-за безысходности решил...

Найти минимально возможное значение
2. Многочлен P(x) с целыми коэффициентами удовлетворяет следующим условиям: P(5) = 25, P(7) = 49,...

Минимально возможное число разрезов торта
Входной файл INPUT.TXT содержит натуральное число N – число гостей, включая самого виновника...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru