gpt4 book ai didi

python - Cython 为应评估为 0.5 的表达式返回 0?

转载 作者:行者123 更新时间:2023-12-03 17:08:26 25 4
gpt4 key购买 nike

出于某种原因,Cython 在计算结果为 0.5 的数学表达式上返回 0:

print(2 ** (-1))  # prints 0

奇怪的是,混合变量,它会按预期工作:

i = 1
print(2 ** (-i)) # prints 0.5

对于这两种情况,Vanilla CPython 都返回 0.5。我正在编译 37m-x86_64-linux-gnu , 和 language_level设置为 3 .

这是什么巫术?

最佳答案

这是因为它使用 C 整数而不是 Python 整数,所以它匹配 C 行为而不是 Python 行为。我相对确定这曾经被记录为某处的限制,但我现在找不到了。如果您想将其报告为错误,请转到 https://github.com/cython/cython/issues ,但我怀疑这是为了兼容性而故意牺牲速度。

代码被翻译成

__Pyx_pow_long(2, -1L)

哪里 __Pyx_pow_longstatic CYTHON_INLINE long __Pyx_pow_long(long b, long e) 类型的函数.

修复它的最简单方法是将一个/两个数字更改为浮点数
 print(2. ** (-1))

作为对设计选择的一般评论:来自C世界的人们普遍期待 int operator int返回 int ,此选项将是最快的。 Python 过去曾尝试使用 Python 2 除法行为(但不一致 - power 总是返回一个浮点数)来做到这一点。

Cython 通常会尝试遵循 Python 行为。然而,很多人使用它来提高速度,所以他们也尝试退回到快速的、类似 C 的操作,尤其是当人们指定类型时(因为这些人想要速度)。我认为这里发生的事情是它能够自动推断类型,因此默认为 C 行为。我怀疑理想情况下它应该区分指定的类型和它推断的类型。然而,现在开始改变它也可能为时已晚。

关于python - Cython 为应评估为 0.5 的表达式返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59702410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com