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)