需要更多来自fprintf的精度 - Matlab

时间:2011-09-29 16:51:27

标签: matlab

M-文件

fprintf('\n\nn!\n')
for i=[1:length(timearray)]
    fprintf('%s \t %d \n', stringarray{i},factorial(timearray(i)))
end

输出

n!
microsecond      1 
minute       Inf 
hour         Inf 
day          Inf 
month        Inf 
year         Inf 
century      Inf 

我正在尝试计算在n运行的算法的步数!采取上述间隔(假设1步= 1微秒)。但是,我无法让fprintf显示有意义的结果。

切换到fprintf('%s \t %bu \n', stringarray{i},factorial(timearray(i)))给了我一些数字,但我怀疑他们错了。

%bu输出

n!
microsecond      04607182418800017408 
minute       09218868437227405312 
hour         09218868437227405312 
day          09218868437227405312 
month        09218868437227405312 
year         09218868437227405312 
century      09218868437227405312 

免责声明:我写了这个程序来解决作业问题,但作业从未指定编写程序。

感谢您的帮助!

麦克

2 个答案:

答案 0 :(得分:5)

问题可能不在于打印本身,而在于析因计算本身是溢出的。尝试仅评估值而不是在循环中打印它;你会发现在170之后阶乘函数溢出!

避免这种情况的一种简单方法是返回log-factorial:

log_factorial = @(n) sum(log(1:n));

然后,您可以在不必担心溢出的情况下比较不同规模的数值。注意:上面的函数没有矢量化,因此只能使用单个值输入;如果您需要使用数组值,那么似乎other solutions已经可用。

答案 1 :(得分:0)

看起来Matlab可能有64位整数,这个数字是整数耗尽之前最大的因子。我没有Matlab,所以无法测试它,但只是停下来思考一个数字因子(世纪)将会有多大......