Разница между 1./n и (double) 1/n;

#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;