当n为0时,除z /(x / n)

时间:2013-10-05 11:31:43

标签: c++

我有一个算术表达式,例如:

float z = 8.0
float x = 3.0;
float n = 0;
cout << z / (x/n) + 1 << endl;

为什么我的正常答案等于1,应该是&#34; nan&#34;,&#34; 1.#inf&#34;等等?

2 个答案:

答案 0 :(得分:5)

我假设您正在使用浮点运算(虽然不能确定,因为您没有告诉我们)。

IEEE754浮点语义在扩展实线上工作,包括两端的无穷大。这使得为​​任何(非NaN)分母定义非零分子的除法,与通常的算术规则“一致”(即连续延伸):x / n是无穷大,并且z除以无穷大为零 - 就像您将表达式简化为n * z / x一样。

唯一真正未定义的数量是0/0和inf / inf,它们由特殊值NaN表示。

答案 1 :(得分:2)

IEEE 754指定3/0 = Inf(或任何正数而不是3)。 8/Inf给出0.如果你加1,你将收到1.这是因为0表示“0或非常接近它的东西”和Inf“无穷大或非常大的数字”。它还允许在限制上执行一些操作,因为它有效地将实数扩展到无穷大。当限制无法实现时(或通过简单的实现不易计算),NaN被保留。

作为副作用,您会遇到一些奇怪的效果,例如0 == -01/0 == Inf1/-0 == -Inf。重要的是要记住FP算法不正常 - 例如cos(x) * cos(x) + sin(x) * sin(x) - 1 != 0即使x != NaN && x != Inf && x != -Inf。对于花车和x == 1,结果为-5.9604645e-8。因此,并非所有期望都可以很容易地转移到它 - 就像在这种情况下除以0一样。

虽然C / C ++并未强制要求IEE 754规范用于浮点数,但它现在是规范,几乎可以在任何硬件上实现,因此大多数C / C ++实现都会使用。