我正在编写一个计算e^x值的方法.我在python中实现这一点的方法如下.

import math

def exp(x):
    return sum([
        x**n/math.factorial(n)
        for n in range(0, 100)
    ])

这将很好地返回e^x的值.但是,当我try 在c#中实现相同的方法时,它没有输出与python中相同的值.以下是c#中的实现.

static double exp(int x)
{
    double FinalAnswer = 0;
    for (int j = 0; j <= 100; j++)
    {
        FinalAnswer += (Math.Pow(x, j))/Factorial(j);
    }
    return FinalAnswer;
}

该代码的输出起初是一个无穷大符号.为了解决这个问题,我只是减少了循环的运行次数.c语言中循环只运行了10次的代码输出与python中循环运行了100次的代码输出非常接近.我的问题是,在不同的编程语言中,两个循环之间发生了什么.起初,我认为我在计算e^x的方法中使用的表达式收敛得很快.但是,一个运行10次的循环如何生成与运行100次的循环的输出相匹配的输出呢.

此外,当我将c中的for循环增加到20和30时,e^x的值x&gt;3个离得太远了.有人能解释一下这是怎么回事吗?

我的Factorial函数如下所示,当我try 打印它的结果以增加n时,它会快速变为半随机值,而不是0.我怀疑这就是我的exp行为错误的原因.

int Factorial(int n)
{
   int factorial = 1;

    for (int i = 1; i <= n; i++)
    {
        factorial *= i;    
    }
    return factorial; 
}

推荐答案

在C#版本的阶乘函数中,您可能会遇到integer overflow个(至少是它的实现,或者它来自哪里).

在C#中,int是一种存储在32位内存中的数字类型,这意味着它以-2^31 <= n <= 2^31 - 1为界,-2^31 <= n <= 2^31 - 1约为+/-21亿.您可以try 使用long类型,这是一种64位数字类型,但是对于for循环中更大的上界,例如接近int,您也会溢出long.

当你在C#中运行阶乘函数时,它会在开始的一段时间内正常启动,但是如果你继续运行,你会看到它突然变成负数,如果你继续运行的话,它会变为0并停止变化.你看到了被0除后无穷大的输出,而C#有一种处理双倍运算的方法;那就是只返回double.PositiveInfinity.

python中不会出现这种情况的原因是它使用可变位数来存储其数值.

Added note:您可能还想try 使用一个阶乘函数来处理double类型,而不是intlong类型,但是这样做,您将失go 精确值的精度,但是您可以存储的数字的大小越大,范围就越大

Further Note:如注释中所述,C#有一个名为BigInteger的类型,该类型设计用于处理大量的数字,如从大输入到阶乘函数所期望的值.您可以找到BigInteger文档here的引用

Python相关问答推荐

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

为什么tkinter框架没有被隐藏?

在Python中处理大量CSV文件中的数据

从收件箱中的列中删除html格式

两个pandas的平均值按元素的结果串接元素.为什么?

Python中绕y轴曲线的旋转

Pandas:将多级列名改为一级

使用密钥字典重新配置嵌套字典密钥名

给定高度约束的旋转角解析求解

转换为浮点,pandas字符串列,混合千和十进制分隔符

Python中的变量每次增加超过1

Odoo16:模板中使用的docs变量在哪里定义?

不允许 Select 北极滚动?

如何合并具有相同元素的 torch 矩阵的行?

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中

分解polars DataFrame列而不重复其他列值

无法在盐流道中获得柱子

将像素信息写入文件并读取该文件

大Pandas 中的群体交叉融合