Консультация № 171572
24.08.2009, 13:38
0.00 руб.
0 1 1
Здравствуйте.

Имеется простая программа на С++, которая некорректно работает, если все переменные double, но нормально работает, когда поменял переменные на Long. Прошу объяснить, почему.

Программа находит первое простое число, которое больше 1 000 000 000 (1 млрд).

Значения переменных не превышали 1 000 000 007, однако с переменной double программа не работала.

Код обоих программ в приложение. 1 - исправная. 2 - с ошибкой.

Приложение:
// 1 ПРОГРАММА:

#include <iostream>
#include <math.h>
using namespace std;

bool prime(long n)
{
long sqrt_of_n = sqrt(n);
int i;

for(i=2; i<=sqrt_of_n; i++)
{
if((int)n%i==0) return false;
}
return true;
}

int main()
{
long number=1000000000;

for(;;)
{
number++;

if(prime(number))
{
cout << number << " is a prime number";
return 0;
}
}
}




// 2 ПРОГРАММА:


#include <iostream>
#include <math.h>
using namespace std;

bool prime(double n)
{
double sqrt_of_n = sqrt(n);
int i;

for(i=2; i<sqrt_of_n; i++)
{
if((int)n%i==0) return false;
}
return true;
}

int main()
{
double number=1000000000;

for(;;)
{
number++;

if(prime(number))
{
cout << number << " is a prime number";
return 0;
}
}
}

Обсуждение

Неизвестный
24.08.2009, 14:09
общий
это ответ
Здравствуйте, Иванов Андрей Владимирович.
У меня оба варианта работают одинаково. Просто для вывода используйте оператор:
Код:

cout<<fixed<< number << " is a prime number";

Т.к. по умолчанию точность вывода для действительных чисел составляет 6 знаков.
И не разумно использовать действительную арифметику там, где логичнее использовать целочисленную. Это вредно сказывается на производительности и следует учитывать конечную точность действительных операций и то, что различные компиляторы могут по разному оптимизировать операции. Из за всего этого могут возникать различные нежелательные эффекты.
5
Форма ответа