【问题标题】:Testing if given number is integer测试给定的数字是否为整数
【发布时间】:2011-10-04 10:30:26
【问题描述】:

我正在尝试实现用户定义的函数来测试数字是否为整数:

#include <iostream>
#include <typeinfo>
using namespace std;
bool   integer(float k){
                  if (k==20000) return false;;
                  if (k==(-20000)) return  false;
 if (k==0)  return true;
   if (k<0)  return integer(k+1);
   else if(k>0)  return integer (k-1);
   return false;
}
int main(){

    float s=23.34;
       float s1=45;
       cout<<boolalpha;
       cout<<integer(s)<<endl;
       cout<<integer(s1)<<endl;
       return 0;

}

所以这个想法是,如果一个数字是一个整数,不管它是负数还是正数,如果我们减少或增加一,我们必须得到零,但问题是,我们怎么能为增加和减少创建上限和下限?

【问题讨论】:

  • 我什至不...为什么您认为 >20000 和
  • 是的,你是对的,我已将其更改为 MAX_INT 和 MIN_INT
  • no @tenfour,我正在阅读关于数论的部分,其中讨论了关于(二次)残差和素数残差的根等主题,这里是某种涉及整数项的算法,如果某事物的平方根是整数,那么它就是根,所以这是主要原因
  • 读者:有一个新的very comprehensive Q&A on this topic,明确考虑C++11。

标签: c++ numbers


【解决方案1】:
#include <cmath>

bool is_integer(float k)
{
  return std::floor(k) == k;
}

此解决方案应该适用于k 的所有可能值。我很确定在这种情况下,您可以使用== 安全地比较浮点数。

尝试仔细命名函数。 integer 并没有给出任何线索实际上做了什么,所以我把函数名改成了更有意义的名字。

对于未来,测试一个数字是否为整数应该感觉就像一个非常简单的操作,所以你应该有一种强烈的感觉,最好的解决方案将非常简单。我希望你意识到你原来的解决方案是荒谬的,原因有很多(最大的原因:在绝大多数情况下它会导致堆栈溢出)。

【讨论】:

  • 如果floor&lt;math.h&gt; 中定义的double floor(double),这可能不起作用。对此floor 的调用会将k 转换为双精度,并且该函数将地板作为双精度返回。这里最好用float floorf(float),从&lt;cmath&gt;std::floor(float)更好。
  • 另一个潜在的问题区域是负数,其中floor 从零舍入。最安全的解决方案是return std::floor(std::abs(k)) == std::abs(k)
  • 为什么会导致问题?如果是整数,则不会四舍五入。如果它不是整数,那么它在哪里被四舍五入并不重要,只要它不等于原来的,它不可能是。
  • 这对std::numeric_limits&lt;float&gt;::infinity()返回true
【解决方案2】:

我想到了一个更简单的方法。
考虑一个浮点​​数,比如 1.5。这个数字的下限(即 1)和这个数字的上限(即 2)是不同的。对于其中包含小数部分的任何值都是如此。
另一方面,整数的 floor 和 ceil 值相同。因此,很容易检查数字的 ceil 和 floor 值,从而查看它是否为整数。

#include <cmath>

bool is_integer(float n){
 int c = ceil(n);
 int f = floor(n);
 if(f==c){
  return true;
 } else {
  return false;
 }
}

【讨论】:

    【解决方案3】:

    我们可以使用 math.h 中的 trunc 方法

    #include <math.h>
    
    inline bool IsInt(float n)
    {
        return !(n - trunc(n));
    }
    

    【讨论】:

      【解决方案4】:

      为什么不做这样的事情:

      bool integer(float k)
      {
          return k == (float)(int)k;
      }
      

      ?

      (当然可以随意使用适当的 C++ 类型转换。)

      【讨论】:

      • 请注意,对于足够大的整数(如 1e100),这将返回 false。 (并不是说用户想要的实际上在一般意义上可以通过浮点数实现。)
      • 是的(除了你实际上不能将 1e100 表示为单精度浮点数!) - 我想它对于 > 99% 的用例来说已经足够了。
      • @Mat:事实上,对于足够大的k 值(幅度大于INT_MAX),它具有未定义的行为。
      【解决方案5】:

      好吧,为什么不只是这个??

      #include <iostream>
      using namespace std;
      bool is_integer(float check){
              if (int(check) == check)
                      return true;
              else return false;
      }
      int main()
      {
              float input;
              cin >> input;
              if (is_integer(input))
              cout << endl << "It's an integer";
              else cout << endl <<" Not an integer";
              return 0;
      }
      

      【讨论】:

      • 您的答案int(check) == check 的要点已经出现在其他答案中,并且没有添加任何新内容
      • 好的!我的错,我没有看到其他帖子。 -_-
      【解决方案6】:

      这行不通,至于足够大的浮点数,x-1 == x

      您应该测试浮点数的位模式以检查小数部分是否为0。

      【讨论】:

      • 另外,这里应该避免递归,这是一个非常慢的方法,而不仅仅是 x+/-1==x for |x| -> inf.
      • ...并且几乎在所有情况下都会导致堆栈溢出。
      【解决方案7】:

      limit.h 宏中的整数设置为 INT_MAX(最大值)或 INT_MIN(最小值)

      正确答案

       bool integer(float k)
          {
              if( k == (int) k) return true;
              return false;
          }
      

      【讨论】:

      • 你真的建议他在他的函数中使用这些常量吗?你看到它的作用了吗?
      • 不,用户要求上限和下限.. :-/ 所以我相应地给出了答案..
      【解决方案8】:

      你可以只使用 boost lexical cast header

        bool isinteger(float k){
        try{ 
            int tmp = boost::lexical_cast<int>(k);
            (void*) tmp;
            return true;
        }catch(boost::bad_lexical_cast &c){
        return false;
        }  
      

      【讨论】:

      • 对boost功能感兴趣
      【解决方案9】:

      以下是您问题的有效代码

      bool isInteger( double num ) {
          int n = int(num);
          return (num - n == 0);
      }
      

      现在我将尝试借助 2 个极端案例来解释我的代码

      案例 1要检查的数字 = 1.10。因此 num = 1.10 和 n = 1。但是现在,num - n = 0.10 并且 this 不等于 0。因此代码结果为 false!

      案例 2给定要检查的数字 = 1。因此 num = 1 和 n = 1。但是现在,num - n = 0,这等于 0。因此代码结果是真的!

      【讨论】:

      • 你好,你能在你的答案中添加解释吗?
      • 虽然只有代码的答案可能会回答这个问题,但您可以通过为您的代码提供上下文、此代码工作的原因以及一些文档参考以供进一步阅读,从而显着提高您的答案质量.来自How to Answer“简洁是可以接受的,但更全面的解释更好。”
      • 好的,谢谢大家,那我会添加一些cmets!
      猜你喜欢
      • 2010-11-22
      • 2010-12-17
      • 1970-01-01
      • 2011-01-13
      • 2011-04-07
      • 2013-01-10
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多