【问题标题】:long long int type function returning decimal valuelong long int 类型函数返回十进制值
【发布时间】:2014-08-10 06:18:53
【问题描述】:

我写了一段代码,它将返回给定整数的平方根(没有小数位,即平方根的底)。但是当我调用它时,它给了我一个十进制值。为什么会这样?这是代码`

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

【问题讨论】:

  • 我刚刚用 g++4.8 运行了你的代码,并没有看到这种行为
  • 它似乎也是天花板而不是地板
  • 这可能取决于&lt;iostream&gt;是否出于某种原因包含&lt;cmath&gt;,这取决于实现。
  • @hacks 你的回答总是无效的。此外,这是一个打字错误。
  • 1) 将sqrt 放入命名空间(例如mynamespace),2) 将mid 初始化为正确的初始值。 3)像mynamespace::sqrt一样调用你的函数。

标签: c++ floating-point int


【解决方案1】:

您可能在这里得到std::sqrt,而不是您定义的::sqrt。根据您使用的 C++ 实现,将您的 sqrt 调用限定为 ::sqrt 可能会起作用。更好的是,将您的自定义 sqrt 称为其他名称并直接调用它。

【讨论】:

    【解决方案2】:
    • Microsoft 以间接包含 &lt;cmath&gt; 标头的方式实现了 &lt;iostream&gt; 标头。

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

    • 因此,这种间接包含标题&lt;cmath&gt; 会影响您的sqrt。

    • 在 Clang 或 GCC 等其他编译器中,您不会遇到这种行为。

    解决方案:

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

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

    【讨论】:

      【解决方案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),否则选择第 3 个。为了选择你自己的函数,你必须调用它:

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

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2015-12-18
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        相关资源
        最近更新 更多