Factorial 函数在 Python 中工作,对于 Julia 返回 0

2023-12-28

我在Python中定义了一个阶乘函数,如下所示:

def fact(n):
    if n == 1:
        return n
    else:
        return n * fact(n-1)

print(fact(100))

在 Julia 中如下:

function fact(n)
    if n == 1
        n
    else
        n * fact(n-1)
    end
end

println(fact(100))

对于 100 的评估,python 程序返回一个非常大的数字(如预期)。 Julia 返回 0。对于较小的数字(例如 10),它们都可以工作。

我有两个问题:

  1. 为什么 Python 可以处理这个问题而 Julia 却不能。
  2. 为什么 Julia 不抛出错误而只是打印 0 呢?

Julia 有单独的固定大小整数类型,以及 BigInt 类型。默认类型是Int64,当然是64位。

从100开始!大约需要526位,它显然溢出了Int64.

你可以通过这样做来解决这个问题fact(BigInt(100))(假设你已经required 它),或者当然你可以在fact功能。


曾几何时,Python 也曾经是这样的。它有不同的类型int,它是 16 位、32 位或 64 位,具体取决于您的计算机,以及long,这是任意长度的。如果您在 Python 1.5 上运行程序,它要么像 Julia 一样回绕,要么引发异常。解决方案是调用fact(100L),或者转换为long在 - 的里面fact功能。

然而,在 2.x 系列的某个时刻,Python 将这两种类型捆绑在一起,因此任何int自动溢出变成long。然后,在3.0中,它完全合并了这两种类型,因此没有单独的long不再了。


那么,为什么 Julia 只是溢出而不是引发错误呢?

常见问题解答实际上解释了为什么 Julia 使用本机机器整数运算 http://docs.julialang.org/en/latest/manual/faq/#why-does-julia-use-native-machine-integer-arithmetic。其中包括溢出时的环绕行为。


人们通常所说的“本机机器算术”是指“C 在几乎所有 2 补码机器上所做的事情”。尤其是像 Julia 和 Python 这样最初构建在 C 之上的语言,并且非常接近金属。就 Julia 而言,这不仅仅是一种“默认”,而是一种有意的选择。

在 C 中(至少当时是这样),实际上取决于实现,如果溢出有符号整数类型(例如int64…但在几乎所有原生使用 2 的补码算术的平台上(几乎是您今天看到的所有平台),都会发生完全相同的事情:它只是截断前 64 位以上的所有内容,这意味着您从正数换到负数。实际上,unsigned整数类型是required在 C 中以这种方式工作。(同时,C 也以这种方式工作,因为这就是大多数 CPU 的工作方式。)

In C (unlike大多数 CPU 的机器语言),没有办法在事后检测到溢出。所以,如果你想提高OverflowError,您必须编写一些逻辑来检测乘法在执行之前是否会溢出。你必须在每次乘法中运行该逻辑。您可以通过编写内联汇编代码针对某些平台对此进行优化。或者,您可以转换为更大的类型,但是(a)这往往会使您的代码变慢,并且(b)如果您已经在使用最大的类型(其中int64今天在许多平台上)。

在 Python 中,使每次乘法减慢 4 倍(通常更少,但也可能那么高)没什么大不了的,因为 Python 花费更多时间来获取字节码和拆箱整数对象,而不是乘法。但 Julia 的速度应该比这更快。

正如约翰·迈尔斯·怀特 (John Myles White) 在《计算机是机器 http://www.johnmyleswhite.com/notebook/2013/01/03/computers-are-machines/:

在许多方面,Julia 试图恢复从 C 到 Python 等语言的过渡中失去的一些功能,从而使自己与其他新语言区分开来。但这种转变伴随着巨大的学习曲线。


但这还有另一个原因:溢出有符号算术在许多情况下实际上很有用。几乎没有溢出的那么多unsigned算术(这就是为什么自第一个 ANSI 规范之前 C 就定义了无符号算术以这种方式工作),但也有用例。

而且,即使您可能想要类型转换的频率比想要翻转的频率更高,但这也很多easier手动进行类型转换而不是翻转。如果您曾经在 Python 中完成过此操作,请选择操作数%正确地识别标志当然很容易出错;投射到BigInt很难搞砸。


最后,在强类型语言(如 Python 和 Julia)中,类型稳定性很重要。 Python 3 存在的原因之一是旧的str类型神奇地转换为unicode造成了问题。这对你来说不太常见int类型神奇地转换为long会导致问题,但这种情况也有可能发生(例如,当您从网络上或通过 C API 获取一个值,并期望以相同的格式写出结果时)。 Python的开发团队在做的时候就这个问题争论过int/long统一,引用“实用胜于纯粹”和禅宗的其他一些内容,并最终决定旧行为比新行为造成更多问题。朱莉娅的设计做出了相反的决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Factorial 函数在 Python 中工作,对于 Julia 返回 0 的相关文章

  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • help() 在 Python 中哪里可以找到信息?

    我发现内置help 最近它打印了模块 函数 方法 类等的一些信息 但是它到底在哪里找到它显示的信息呢 Python 文档 https docs python org 2 library functions html help不要对此给出任何
  • 使用 guid 主键忽略 LINQ to SQL 实体列名称属性

    我正在使用 LINQ to SQL SQL Server 2005 SP3 x64 处理一个简单的实体类 Table Name TBL REGISTRATION public sealed class Registration IDataE
  • scala 范围与大型集合上的列表性能

    我对 10 000 000 个元素运行了一组性能基准测试 我发现每次实现的结果都有很大差异 任何人都可以解释为什么创建 Range ByOne 会产生比简单的基元数组更好的性能 但将相同的范围转换为列表会导致比最坏情况场景更差的性能 创建
  • Windows CE 上的 C# .NET 3.5 CF,更改 DataGrid 中的行背景颜色

    我正在使用 C NET 3 5 CF 为 Windows CE 进行开发 我正在处理数据网格 需要知道如何更改数据网格上行的背景颜色 提前致谢 你必须手动绘制它 这是一篇博客文章 http blogs msdn com b priozers
  • Redis 数据结构空间要求

    redis中排序集和列表的空间有什么区别 我的猜测是 排序集是某种平衡二叉树 列表是链表 这意味着除了我为每个值编码的三个值 键 分数 值 之外 尽管我会将链表的分数和值混合在一起 但开销是链表需要跟踪一个另一个节点 二叉树需要跟踪两个 因
  • 如何通过管道传输到 Next.js 13 api 响应?

    早些时候 我能够将另一个 api 调用的响应通过管道传输到 Next js api 响应 如下所示 export default async function req res prevent same site obfuscate orig
  • 音频会话“闪避”在 iOS 4 中中断...?

    我有一个应用程序 它使用 MPAudioPlayerController 来访问 iPod 音乐库 并使用 AVAudioPlayer 将音频覆盖在音乐之上 我用过本文档 http developer apple com iphone li
  • 使用 Android Studio 和 ndkBuild 无法到达 C++ 断点

    我试图在简单的 C 代码中达到断点 这里是 cpp include
  • 获取手动绘制点的坐标

    我有一个执行结果的图表ListPlot 功能 我可以通过将点移动到不同的位置来手动编辑此图 并使用添加新点绘图工具 http reference wolfram com mathematica tutorial InteractiveGra
  • dplyr case_when 具有动态案例数

    想要使用 dplyr 和case when将一系列指标列折叠为单个列 挑战是我希望能够折叠未指定 动态数量的列 考虑以下数据集 gear已被分成一系列指标列 library dplyr data mtcars mtcars mtcars g
  • 如何从一张画布复制到另一张画布

    这里是jsfiddle http jsfiddle net tahmid UjrJM 2 我把它作为我的源画布 HTML h1 Source Canvas h1
  • Expand.grid() 中的奇怪错误

    我已经创建并评估了对expand grid通过使用eval parse 简而言之 len lt 36 Text lt paste pos lt expand grid paste rep c TRUE FALSE len collapse
  • UILabel 中文本的像素宽度

    我需要绘制一个删除线的 UILabel 因此我将 UILabel 子类化并实现如下 implementation UIStrikedLabel void drawTextInRect CGRect rect super drawTextIn
  • 使用 OAEP 密钥加密的 S/MIME 封装邮件解密失败?

    使用 Java 和 BouncyCastle 我能够解密大量 S MIME 封装的消息 但当密钥加密算法为1 2 840 113549 1 1 7 id RSAES OAEP 解密失败 堆栈跟踪在这个问题的末尾 发生这种情况的行 conte
  • Pocketsphinx安装失败?树莓派零(Raspbian Jessie)

    这可能会被标记为重复项 但我没有任何运气 所以我们开始吧 我正在尝试使用Python2 7开发一个类似 Jarvis 的设置 我希望使用 Pocketsphinx 作为其中的一部分 我尝试在我的 Windows 10 机器上执行此操作 但
  • “.”在哪里? (点)来自使用 PHP 'scandir' 时

    我有点困惑 我正在构建一个 PHP 函数来循环输出指定目录中的图像 PHP dir bilder objekt 0 objekt nr thumbnail thumbnails scandir dir print r thumbnails
  • 如何在生成 PDF 文件下载时显示进度条,而不出现 IE“下载”警告

    我已经在客户端和服务器之间进行了通信 过程很简单 我正在向控制器发出 AJAX POST 请求 该控制器在文件系统中生成 pdf 上述请求成功后 将发出表单 GET 请求以取回 pdf 并打开标准浏览器 保存或打开 对话框 我之所以采用两步
  • C - fwrite 大于 4GB 的二进制文件

    我基本上是 C 新手 我有一个 64 位 Windows 7 配备 64GB RAM 和 240GB SSD 我使用的采集板将采集的数据存储在 2 个内部 FIFO 中 然后将数据传递到 RAM 这样我就有可能采集 60 GB 的数据 我无
  • 部署时字体未加载

    我创建了一个有角度的应用程序 它在本地环境中加载得非常好 所有样式和字体都被应用 但是当我部署它时 字体没有加载 无法弄清楚为什么 它没有在控制台中显示任何错误或警告消息 我正在导入所有 css 样式angular json文件如下 dem
  • Factorial 函数在 Python 中工作,对于 Julia 返回 0

    我在Python中定义了一个阶乘函数 如下所示 def fact n if n 1 return n else return n fact n 1 print fact 100 在 Julia 中如下 function fact n if