Форум программистов, компьютерный форум CyberForum.ru

Ошибка преобразования типа - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Строковый класс http://www.cyberforum.ru/cpp-beginners/thread569833.html
Ребят, помогите решить пожалуйста... Написать программу для работы с строковым классом. В классе предусмотреть все основные операции со строками. Поля и методы класса: Переменная strs - определяет обрабатываемую строку. Конструктор contrings(); - вызывается при создании объекта и выполняет инициализацию массива strs путём занесения в strs символа конца строки. Функции: конкатенация,...
C++ Передача массивов в функцию Помогите с программой пожалуйста!! Конец года, горю.. 1)Вычислить с использованием функции max элементы каждой строки матрицы A(10,20). Результаты формировать в одномерных массивах C(10) и D(10). 2)Определить функции, выполняющие действия в соответствии с вариантом задания. 13. Дан одномерный массив, состоящий из N вещественных элементов. 13.1. Найти максимальный элемент. 13.2. Вычислить... http://www.cyberforum.ru/cpp-beginners/thread569824.html
C++ Имя массива как указатель
Помогите с программой пожалуйста!! Конец года, горю.. Используя имя массива как указатель, и применяя адресную арифметику выполнить задание. 13. Дан одномерный массив, состоящий из N целочисленных элементов. 13.1. Ввести массив с клавиатуры. 13.2. Найти максимальный элемент. 13.3. Вычислить среднее арифметическое отрицательных элементов массива. 13.4. Вывести элементы на экран в обратном...
C++ В последовательности чисел выдать на печать TRUE
В последовательности чисел выдать на печать TRUE, если значение максимального числа больше числа 10.
C++ Алгоритм сортировки методом слияния http://www.cyberforum.ru/cpp-beginners/thread569799.html
Напишите программу, реализующую алгоритм сортировки методом слияния и получите для нее эмпирические оценки функции роста вычислительной и объёмной сложности.
C++ алгоритм двоичная вставка Приведите программную реализацию алгоритма сортировки методом двоичной вставки. Получите для неё эмпирические оценки функции роста вычислительной и объемной сложности. подробнее

Показать сообщение отдельно
G@leON
 Аватар для G@leON
6 / 6 / 1
Регистрация: 02.06.2009
Сообщений: 95
10.05.2012, 01:35     Ошибка преобразования типа
Задача состояла в следующем: реализация алгоритма проверки n на простоту, используя малую теорему Ферма. В силу недостаточного опыта и позднего времени накумекал следующий код с пояснениями:

В качестве 1 из параметров, передаваемых функциям, выступает маркер простоты.
Это параметр-ссылка на переменную логического типа.
Значение маркера = true после выполнения подтверждает простоту проверяемого числа.

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
int gcd(int v_1, int v_2){
    while (v_2){
        int temp = v_2;
        v_2 = v_1 % v_2;
        v_1 = temp;
    }
    return v_1;
}
 
void ferma_lt_test(bool &prime_marker, int n){
    prime_marker = true;
    if (n<1){
        prime_marker = false;
        cout << "n is not natural" << endl;
    }
    if (n>2) {
        int v_1 = 2;
        while ((gcd(n,v_1)) != 1)
            v_1++;
        double deg_v = n, base_v = v_1;
        long l_v1 = exp(deg_v * log(base_v)), l_v2 = exp((deg_v - 1) * log(base_v));
        l_v1 %= n;
        l_v2 %= n;
        if ((l_v1 != v_1) || (l_v2 != 1))
            prime_marker = false;
    }
}
Здесь ф-ция gcd(v_1,v_2) - нахождение НОД. Вторая функция: Тест малой теоремой Ферма.

Ошибка заключается собственно в том, что при преобразовании double в long в строке:
C++ (Qt)
1
long l_v1 = exp(deg_v * log(base_v)), l_v2 = exp((deg_v - 1) * log(base_v));
Оба значение типа long на 1 меньше, чем возвращаемые функциями значения типа double. Притом, данная ошибка вылезает для чисел до 19 включительно. Число 23, как ни странно, проверяется. Помогите исправить.

Соответственно, число 31 уже выходит за границу допустимого диапазона. Было бы неплохо, так же, услышать подсказку по увеличению допустимого диапазона (например, имеется ли стандартный модуль(заголовок) длинной математики в C++, а если нет, то какой лучше и где найти...).

Добавлено через 52 минуты
После проверки на различные варианты преобразования выяснил, что они не помогают, ни преобразование в стиле C, не преобразование в стиле С++ (cast которые). Конечно, проблему можно разрешить проверкой на принадлежность к определенному числу (типа if n < 19 ... то прибавлять к функции +1), но это вообще не выход. Так что проблему надо решать альтернативным методом. Каким, не знаю.

Я так понимаю, задача вылазит несколько другим боком. Нужно как то умудрится возвести в степень n и n-1 число v_1, а результат потом делить на n с получением остатка от деления.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru