【问题标题】:INT_MAX divided by twice of itself (INT_MAX * 2)INT_MAX 除以自身的两倍 (INT_MAX * 2)
【发布时间】:2018-03-14 17:54:07
【问题描述】:

在 C++ 中,我想知道如何获得“INT_MAX / (INT_MAX + INT_MAX)”的正确答案 0.5?我尝试将除数/除数和除数都转换为长,并将除数转换为双倍,全部返回-1073741823。谁能给我一些建议?谢谢。

【问题讨论】:

  • 0.5 是 double 所以你需要浮点除法。 INT_MAX + INT_MAX 也会给你一个错误的结果。
  • double correct_answer = 0.5;
  • @storyteller: 肯定是 constexpr 吗? ;-)
  • @Bathsheba - 你了解我,我不喜欢用勺子喂 OP:P
  • @EricWong - 如果我冒犯了你,我深表歉意。我只是在开玩笑。尽管您在最初发布时应该提供这些详细信息。如果您的问题是“如何防止此等式可能发生溢出”,那将是一个好问题!取而代之的是,你用一种为愚蠢的解释留出空间的方式来表达它,就像我的一样。

标签: c++ division outofrangeexception numeric-limits


【解决方案1】:

你正在尝试的事情是不可能的,原因有两个。

首先,INT_MAX + INT_MAX 不能用int 表示,这是合乎逻辑的,因为int 的最大值是INT_MAX。这会导致溢出。

其次,即使您尝试使用(3 / (3 + 3)),您也会得到 0,因为您使用的是整数而不是小数。做你想做的事你可以试试:

static_cast<double>(INT_MAX) / (static_cast<double>(INT_MAX) + static_cast<double>(INT_MAX)) 虽然这没有兴趣。

【讨论】:

  • 如果你小心你把它放在哪里,你实际上只需要一个static_cast<double>
  • @Justin 就语言而言是正确的,但对于人类读者,我可能至少会留下第一个 INT_MAX 的演员表。
  • 那既然是废话,为什么还要回答呢?为体面的问题节省你的精力。但是,如果您确实决定回答,请尽最大努力。
  • 我是第二个讲故事的人,通过回答一个您认为质量低下的问题,您实际上会降低它得到改进的机会(不想指向某人,经常发生在我身上,只是说.. .)
  • @StoryTeller:如果我回答“do INT_MAX / (static_cast<double>(INT_MAX) + INT_MAX)”,你认为它会对 OP 有帮助吗?而且对于编译器和执行来说绝对没有区别,那有什么意义呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多