long long int类型函数返回十进制值

时间:2014-06-19 16:04:41

标签: c++ floating-point int

我写了一段代码,它将返回平方根(没有小数位,即平方根的底面)给定一个整数。但是,当我打电话给它时,它给了我一个小数值。为什么会发生这种情况?这是代码`

#include<iostream>

using namespace std;

long long int sqrt(long long int a){
    long long int upper = a,lower=0;
    long long int mid = 0;
    while (!(mid*mid >= a and (mid-1)*(mid-1) < a)){
        mid = (lower+upper)/2;
        if(mid*mid > a){
            upper = mid;
        }
        else if(mid*mid <= a){
            lower = mid;
        }
    }
    return mid;

}    
int main(){
    int a;
    while(cin>>a){
        cout<<sqrt(a)<<endl;
    }
}

3 个答案:

答案 0 :(得分:3)

您可能会在此处std::sqrt而不是您定义的::sqrt。根据您正在使用的C ++实现,将sqrt调用视为::sqrt可能会有效。更好的是,将您的自定义sqrt称为其他内容并直接调用它。

答案 1 :(得分:3)

在其他答案中已正确识别出问题的原因,但解决方案并不令人满意。您希望sqrt(您自己的函数和namespace std中提供的函数)的所有重载都可用,并且不需要像mymath::sqrt这样的任何范围解析。

解决方案必须查看函数调用。你基本上有

long long int sqrt(long long int);  // your function
float sqrt(float);                  // from namespace std
double sqrt(double);                // from namespace std
long double sqrt(long double);      // from namespace std
double sqrt(integral_type);         // from namespace std in C++11

由于你调用sqrt(int),最后的重载将被选中(如果你有C ++ 11),否则将被选中。要选择自己的功能,您必须调用它:

int main(){
    long long int a;
    while(cin>>a) {
        cout<<sqrt(a)<<endl;
    }
}

答案 2 :(得分:2)

  • Microsoft以间接包含<iostream>标题的方式实施了<cmath>标头。

  • 这不是错误,C ++标准并未规定禁止在STL标头中间接包含其他STL标头。

  • 因此,标题<cmath>的间接包含会影响您的sqrt

  • ClangGCC之类的其他编译器中,您不会遇到此类行为。

解决方案:

  1. 将您的sqrt函数放在单独的命名空间中(例如mymath)。
  2. 在代码中调用您的函数mymath::sqrt

  3. #include<iostream>
    
    namespace mymath {
      long long int sqrt(long long int a) {
        long long int upper = a;
        long long int lower = 0;
        long long int mid   = 0;
    
        while (!(mid * mid >= a && (mid - 1) * (mid - 1) < a)){
          mid = (lower + upper) / 2;
          if (mid * mid > a){
            upper = mid;
          } else if (mid * mid <= a){
            lower = mid;
          }
        }
        return mid;
      }
    }
    
    int main(){
      int a;
      while (std::cin >> a){
        std::cout << mymath::sqrt(a) << std::endl;
      }
    }