Excel如何正确评估FACT(170)/ FACT(169)?
170! 接近浮点数的极限double:171! 会溢出。
不过170! 超过300位数字
所以没有办法 ,170! 可以用浮点精确表示。
然而,Excel将返回170的正确答案! / 169 !.
为什么是这样? 我希望一些错误蔓延,但它返回一个整数值。 Excel以某种方式知道如何优化这个计算?
如果你发现最接近的double
至170! 和169!,他们是
double oneseventy = 5818033100654137.0 * 256; double onesixtynine = 8761273375102700.0;
次数是两次相同的次数。 与这些商的最接近的double
恰好是170.0。
此外,Excel可能会计算170! 乘以169! 到170。
威廉·卡汉(William Kahan)有一篇名为“ 在浮点运算中四舍五入的评估 ”的文章,他讨论了Excel中的一些疯狂。 这可能是因为Excel并不是完全计算,而是隐藏了一大堆现实。
tmyklebu的答案已经完美了。 但我想知道更多。
如果执行n! 是return double(n)*(n-1)!
…
这是一个Smalltalk片段,但是你可以翻译成其他许多语言,这不是重点:
(2 to: 170) count: [:n | | num den | den := (2 to: n - 1) inject: 1.0 into: [:p :e | p*e]. num := n*den. num / den ~= n].
答案是12
所以你不是特别幸运,因为这个数字有很好的性质,在这169个数字中,只有12个不像预期的那样。
哪个? replacecount:
通过select:
你会得到:
#(24 47 59 61 81 96 101 104 105 114 122 146)
如果我有一个方便的Excel,我会要求评估146!/ 145!
奇怪的是(只是显然好奇),一个不那么天真的解决scheme,用大整数算术计算确切的因子,然后转换为最接近的浮点数,效果并不好!
(2 to: 170) reject: [:n | n factorial asFloat / (n-1) factorial asFloat = n]
导致:
#(24 31 34 40 41 45 46 57 61 70 75 78 79 86 88 92 93 111 115 116 117 119 122 124 141 144 147 164)