c - 为什么这个阶乘算法不准确

标签 c algorithm

抱歉,我觉得问这个问题很愚蠢,我准备失去一半的分数,但为什么这个算法不起作用?它在一定程度上起作用。在数字 13 之后,阶乘有点偏离。例如,数字在数十万位及以后并不完全匹配。

#include <stdio.h>

float factorial(unsigned int i) {

    if (i <= 1) {
        return 1;
    }
    return i * factorial(i - 1);
}

int  main() {
    int i = 13;
    printf("Factorial of %d is %f\n", i, factorial(i));
    return 0;
}

这是输出:

Factorial of 13 is 6227020800.000000

这是一个不准确输出的例子:

Factorial of 14 is 87178289152.000000

数字 14 的输出实际上应该是这样的(来自 mathisfun.com)

14        87,178,291,200

我将返回类型更改为 float 以获得更准确的输出,但大部分代码是从此处获得的:https://www.tutorialspoint.com/cprogramming/c_recursion.htm

编辑:如果我将返回类型更改为加倍,则输出精确到 21。我正在为 %Lf 中的输出使用字符串格式化程序em>printf 函数。

最佳答案

简单。 float 无法在不损失精度的情况下准确存储大于 16777216 的整数。

int 优于 float。但是试试 long long 这样你就可以正确地存储 19 位数字了。

关于c - 为什么这个阶乘算法不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510473/

相关文章:

c - 使用单个变量/寄存器存储 2 个值(并通过位掩码和/或字长的特定 CPU 指令读取它们)

python - 是否可以在不超过最大递归深度的情况下在 python 中使用参数 m>=4 和 n>=1 计算递归 ackermann(m,n) 函数?

c - 在 rollDice 函数中调用 srand(time(NULL)) 时出现问题

c - 两个正数相乘在 C 中返回负数

c - 在c、linux中使用信号进行进程间同步

c - 静态变量和全局变量都驻留在数据段中。尽管如此,静态变量的范围还是有限的。为什么?

c - kernel.h中min宏中 "(void) (&_min1 == &_min2)"的作用是什么?

php - 在 URL 中公开类和方法名称是否不安全?

algorithm - 在 O(n) 时间内排序?

java - 拼写校正算法