我有一个算术表达式,例如:
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;等等?
答案 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 == -0
但1/0 == Inf
和1/-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 ++实现都会使用。