【问题标题】:Gnuplot factorial calculation outputGnuplot 阶乘计算输出
【发布时间】:2021-11-16 10:06:33
【问题描述】:

我想在 gnuplot 中测试一个递归函数。 下面是函数

factorial(n)= ((n==1?sprintf("1"):sprintf("%f",n*factorial(n-1))))

当 factorial(100) 测试时,它看起来不错

93326215443944102188325606108575267240944254854960571509166910400407995064242937148632694030450512898042989296944474898258737204311236641477561877016501813248.000000

为了使数字成为整数,我像这样更改了 sprintf

factorial(n)= ((n==1?sprintf("1"):sprintf("%d",n*factorial(n-1))))

但是,结果很奇怪;它似乎超出了整数大小的范围?

-2147483648

所以我改变了实数类型的函数,没有低于浮点数的数字

factorial(n)= ((n==1?sprintf("1"):sprintf("%.0f",n*factorial(n-1))))

但是,结果比较奇怪,

-75703234367175440481992733883343393025021587121454605713387911182978138051561570016048371488788270318477285688499861254195149884149214115360733197762560

你能解释一下它是什么吗? 谢谢,

【问题讨论】:

  • 即使没有 Ethan 解释的背景,您的 factorial(100) 看起来也不好!由于您将数字从 1 乘以 100,因此结果的最后一位应该是很多零(我猜至少是 20),但绝对不是 ...13248

标签: function recursion floating-point gnuplot factorial


【解决方案1】:

可以用 32 位表示的最大整数是 2147483647。 所以一个 32 位整数(gnuplot 到 5.2 版)用完 12 位之间的位!还有 13 个!

一个 64 位整数 (gnuplot 5.4) 用完 20 之间的位!还有 21 个!

如果您使用双精度浮点运算,它可以容纳更大的数字,但位数仍然会限制精度。 64 位浮点只有约 53 位精度,因此它可以表示的最大精确阶乘实际上小于 64 位整数所能处理的。

请注意,如果 n 是整数,则所有示例 gnuplot 代码都使用整数算术。更改为浮点格式进行打印不会改变这一点。

【讨论】:

    【解决方案2】:

    不确定您的最终目标是什么...但只是为了好玩和可行,您可以使用 gnuplot 计算 Factorial(100)。 但是,您将获得字符串形式的结果。我还没有测试过参数ad 的限制是什么。对于a,它将是最大字符串长度,对于d,可能是整数限制(32 位或 64 位)。

    代码:

    ### factorial for large numbers (output as string!)
    reset session
    
    # a: integer number string 
    # d: integer number   
    Multiply(a,d) = (_u=0, _tmp='', _n=strlen(a), sum [_i=1:_n] (_j=_n-_i+1, \
               _m1=a[_j:_j]*d, _d1=(_m1+_u)%10, _u=(_m1+_u)/10, \
               _tmp=sprintf("%d%s",_d1,_tmp),0), _u ? sprintf("%d%s",_u,_tmp) : _tmp)
    
    Factorial(n) = (_tmp="1", sum [_j=1:n] ( _tmp=Multiply(_tmp,_j), 0), _tmp)
    
    print Factorial(100)
    ### end of code
    

    结果:1​​00!(实际上,末尾有 24 个零)

    93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多