#c #c 11 #visual-c #c 14
#c #c 11 #visual-c #c 14
Вопрос:
Я начинающий программист, и у меня есть вопрос.В чем разница между double exp = (double)1/n, double result = pow(a,rez)
и этим кодом: (в строке 11). В моей задаче мне нужно решить среднее геометрическое значение.
int main()
{
int n, a;
float sum = 1;
cin >> n;
for (int i = 0; i < n; i )
{
cin >> a;
sum *= a;
}
double result = pow(sum, (1.0 / n));
//cout << result << endl;
cout << fixed << setprecision(2) << resu<
return 0;
}
Комментарии:
1. как вы думаете, почему есть разница (кроме того, что ваш пример не компилируется из-за неопределенных переменных)?
2.
(double)1
является целым числом, приведенным к удвоению. он преобразует int в double, поэтому деление является делением с плавающей запятой, а не целочисленным делением. Фрагмент кода использует двойную литеральную константу1.0
, что также делает его делением с плавающей запятой
Ответ №1:
Разницы нет. Обе версии обеспечивают операцию деления для получения допустимого результата с плавающей запятой. Язык гарантирует, что результат будет иметь наибольшее количество элементов, задействованных здесь. Точная терминология для этого — ранг конверсии, см.
https://en.cppreference.com/w/c/language/conversion
Только для ясности, я думаю, вы знаете, что:
std::pow обеспечивает несколько перегрузок целых чисел и чисел с плавающей запятой для экспоненты, см.
https://en.cppreference.com/w/cpp/numeric/math/pow
Для обеспечения того, чтобы показатель степени действительно предоставлялся как значение с плавающей запятой (и в большинстве случаев не сворачивался до нулевого целого числа), требуется используемый вами синтаксис.
В качестве дополнительного примечания, только мои личные предпочтения:
Насколько это возможно, я всегда старался избегать старого синтаксиса приведения C, даже для простых арифметических типов. Я думаю, это выглядит более явно, менее подвержено ошибкам, поскольку у людей, как правило, возникают проблемы со скобками и соответствующим порядком вычисления в языках программирования, и удобно для обычно рекомендуемого стиля приведения C :
int x = 2;
int y = 3;
auto result = static_cast<double>(x) / y;