【问题标题】:Solving Equality Equation in c++在 C++ 中求解等式
【发布时间】:2014-05-10 22:19:50
【问题描述】:

需要格式化,编辑需要一些时间。

【问题讨论】:

  • 请修正缩进,以便更容易看到差异。另外,float 你在说什么?
  • 除了解析的差异非常小外,没有任何区别,您对上述内容有何期望,您将得到什么?
  • 运行代码你会看到区别
  • 据我所知,在任何版本中都没有从 float 或 double 进行转换,但由于有符号整数溢出,它们都未定义。

标签: c++ int double


【解决方案1】:

您的问题是由于将unsigned int l 与转换为int 的表达式进行比较,这会产生未定义的结果。在第二种情况下,内部表达式全部评估为unsigned int,并在评估后转换为int(精度损失可能会降低正值)。在您的第一种情况下,除法函数的提名者被强制转换为int before除法适用。

你最好这样写你的条件,或者甚至更好地省略演员表(你的表达式中没有单独的floatdouble数学运算,你只处理unsigned int):

while(l>(unsigned int)(i*(i+1)*(2*i+1))/3) { // ...
      // ^^^^^^^^

如果您这样做,您将始终体验到循环无休止地运行或运行很长时间。恕我直言,检查条件表达式的结果是否可能大于std::numeric_limits<unsigned int>::max(),这是没有意义的,它不能更大。

【讨论】:

  • 如果你向int 展示了转换,这可能是有道理的,因为类型转换比算术运算具有更高的优先级。但是你展示它的方式,我认为应该是一样的。
  • @juanchopanza 我仍然不确定真正的原因是什么,当然你是对的,它不应该有所作为。可能是表达式在某些时候会有不同精度的临时结果,或者可能发生溢出的不同点?
【解决方案2】:

此代码不会为您提供正确答案。计算可以重写为 (i*(i+1)*(2*i+1))

【讨论】:

    【解决方案3】:

    while循环中出现的不等式是3阶的。这种曲线的斜率很高,这意味着坐标的微小变化会在y中产生巨大的量。 while 循环在比较 unsigned int 和 i 溢出时很快遇到,因此给出了永无止境的循环(是的,永无止境,我试过了)。

    解决方案很简单。打破对数不等式。现在三阶多项式是对数的线性。最终成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多