【问题标题】:Differentiate between a number (of type double) with decimal places and one without - c++区分带小数位的数字(双精度型)和不带小数位的数字-c ++
【发布时间】:2011-07-22 00:35:43
【问题描述】:

我正在尝试在 C++ 中实现一个简单的抽取算法。我有两个数组,比如pq,其中的下标通过以下关系相互关联:

p[k] = q[0.5*k]。这意味着以下序列应该保持有效:

p[0] = q[0]  
p[1] = 0  
p[2] = q[1]  
p[3] = 0  
p[4] = q[2]  

等等……

请注意,p[k] 仅在 (0.5*k) 的结果不包含小数位(或十进制为 0)且不使用任何四舍五入等情况下才取值。

我的问题是: 有没有办法区分整数(没有小数位的数字或小数点中只有 0,比如 2.0)和 C++ 中的小数位数字,前提是两者被投到双倍?

eg.) 2.0 是一个整数转换为 double。 2.1 是带小数位的数字。
例如。 2) * 0.9*2 应将 0 放入数组 p 中,而 0.9*10 应将 q[9] 放入数组 p 中。*

如果我使用语句 (int) (0.5*k),那么无论 k 的值如何,我都会在每种情况下得到一个整数。

编辑: 上述案例中的 0.5 只是说明性的。它可以是任何数字,例如 2、2.5、0.9、0.95 等)

欢迎任何帮助,
谢谢,
斯里拉姆。

【问题讨论】:

  • 为什么不使用整数除法?
  • 还有,在数学上你如何区分整数和整数?
  • @Johnsyweb,可能是因为4/25/2 都将返回2,而5/2 应该以这样的方式失败,而Sriram 知道将0 填充到@987654333 @.
  • 你的数组是由 int 组成的吗?如果结果与 0 不同,您不能只使用模数 (%2) 并且不执行任何操作吗?
  • 整数和整数有什么区别?????

标签: c++ integer double rounding


【解决方案1】:

k % 2 在这个帖子的几个答案中。

但是,这在回答 OP 的问题时没有用。注意编辑: "编辑:上述案例中的 0.5 只是说明性的。它可以是任何数字,比如 2、2.5、0.9、0.95 等)"

k % 2 仅适用,因为选择的值是 0.5。它不适用于任何其他值。

因此,除非我完全遗漏了某些东西,否则我能想到的最简单的方法如下:

从数字本身中减去数字的下限。如果结果 > 0,则不是整数。

【讨论】:

    【解决方案2】:

    你想要做的简短语法可能是这样的:

    p[k] = k % 2 ? 0 : q[k/2];
    

    有没有办法在 C++ 中区分整数和整数?

    定义整数,并在此上下文中定义整数。我很困惑!

    您是否按照here? 解释的那样考虑差异

    如果您想检测一个数字是否为整数,那么这可能会有所帮助:

    #include<cmath>
    
    bool IsInteger(double d)
    {  
        double intpart;
        return std::modf(double number, &intpart) == 0.0;
    }
    

    【讨论】:

    • 感谢您的意见。我已经编辑了上面的问题。希望更清楚
    • 我可能搞砸了这个问题的早期版本。请查看已编辑的问题,如果您仍有疑问,请告诉我。
    • 如果 d &gt; LONG_MAX,您的 IsInteger 函数将严重失败。更好的解决方案是使用 std::modf(在 中)。
    • @James:我有这个想法,但不知道如何解决。无论如何,我现在按照您的建议进行了尝试。看看并告诉我它是否正确!
    【解决方案3】:

    @Aix 对k%2 的建议看起来可以很好地与?: 运算符结合使用:

    p[k] = (k%2) ? 0 : q[k/2];
    

    【讨论】:

    • ITYM p[k] = (k % 2) ? 0 : q[k / 2]; ?
    【解决方案4】:

    假设 coef 可以是其他任何东西,

    p[floor(coef*k)] = (fabs(coef*k-floor(coef*k))<1E-6)?q[k]:0;
    

    【讨论】:

    • 如果可以更改表达式以将结果与 1 进行比较(
    • (coefk-floor(coefk)) 是 coef*k 的小数部分。它总是
    • 除了 0.5 等,由于精度有限,它永远不会为 0。这就是我与 1E-6 即 0.000001 进行比较的原因 - 检查双精度是否等于 等于 是没有意义的。
    【解决方案5】:

    除非你的表达式会导致无理数,否则你可以使用Boost.Rational 来表示你的indizes。

    【讨论】:

      【解决方案6】:

      假设k 是整数类型,您可以使用if (k % 2 == 0) ... 来检查k 是否可以被2 整除:

      if (k % 2 == 0)
        p[k] = q[k / 2];
      else
        p[k] = 0;
      

      这也可以用三元运算符表示:

      p[k] = (k % 2 == 0) ? q[k / 2] : 0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2014-05-17
        • 2013-07-17
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        相关资源
        最近更新 更多