sqrt (int_value + 0.0) — это имеет цель?

в то время как выполнение некоторой домашней работы в моей очень странной книге C++, которую мне сказали прежде выбросить, имело очень специфический сегмент кода. Я знаю, что материал домашней работы всегда добавляет дополнительную "тайну", чтобы попытаться смутить Вас как расположение с отступом 2 строк после отдельного оператора для цикла. Но этот, я смущен на том, потому что это, кажется, служит некоторой реальной цели.

в основном это похоже на это:

int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...

Я интересуюсь этой частью особенно:

sqrt(counter+0.0)

Есть ли некоторая цель к +0.0? Действительно ли это - poormans способ сделать статический бросок к двойному? Это избегает некоторого предупреждения компилятора на некотором компиляторе, который я не использую? Вся программа распечатала ту же самую вещь и скомпилировала без предупреждений на g ++ каждый раз, когда я не учел +0.0 часть. Возможно, я не использую достаточно странный компилятор?

Править:

Кроме того, делает gcc, просто повреждают стандарт и не совершают ошибку для Противоречивой ссылки с тех пор sqrt может взять 3 различных типов параметров?

[earlz@EarlzBeta-~/projects/homework1] $ cat calc.cpp
#include 

int main(){
  int counter=0;
  sqrt(counter);
}
[earlz@EarlzBeta-~/projects/homework1] $ g++ calc.cpp
/usr/lib/libstdc++.so.47.0: warning: strcpy() is almost always misused, please use strlcpy()
/usr/lib/libstdc++.so.47.0: warning: strcat() is almost always misused, please use strlcat()
[earlz@EarlzBeta-~/projects/homework1] $

Кроме того, вот соответствующая часть моих системных библиотек cmath Я не слишком увлечен шаблонами, таким образом, я не уверен, что это делает

  using ::sqrt;

  inline float
  sqrt(float __x)
  { return __builtin_sqrtf(__x); }

  inline long double
  sqrt(long double __x)
  { return __builtin_sqrtl(__x); }

  template
    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
                       double>::__type
    sqrt(_Tp __x)
    { return __builtin_sqrt(__x);

7
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Это способ Пурмана выполнять статическое приведение к двойнику?

Да.

Вы не можете вызвать sqrt с int в качестве параметра, потому что sqrt принимает float , double , или длинный двойной . Вы должны привести int к одному из этих типов, иначе вызов будет неоднозначным.

13
ответ дан 6 December 2019 в 19:35
поделиться

причина выражения counter + 0.0 в том, чтобы явно сделать его действительным числом. если мы не добавим 0.0, компилятор выполнит неявное преобразование

0
ответ дан 6 December 2019 в 19:35
поделиться

Это просто другой способ приведения к двойному значению. Это происходит потому, что sqrt не принимает ints. Поскольку двойка выше, она объединит int в 0.0. Аналогичный способ можно использовать для преобразования из (int,double,float) в строку.

double n = 0;

string m = ""+n;

0
ответ дан 6 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: