同一变量在方程中返回不同的值

3

我试图创建一张图表,但看起来不正确。 对于范围(0, 1000000),图表应该从0开始,在x轴上结束于1,但它有负值。一开始还好,但在某些值之后就会出错。

我尝试手动计算特定的值,发现同一个方程得到了不同的结果。以下是一个例子:

import numpy as np
import matplotlib.pyplot as plt

def graph(formula, x_range):
    x = np.array(x_range)
    y = eval(formula)
    print(y)
    plt.plot(x, y)
    plt.show()

formula = '1-((2**32-1)/2**32)**(x*(x-1)/2)'
graph(formula, range(80300, 80301))

x = 80300
print(eval(formula))

同一个值得出了不同的结果,这是控制台输出:

[-0.28319476]

0.5279390283223464

我不知道为什么同一个公式和数值会产生不同的结果。正确的结果应该是0.5279390283223464。


1
我无法重现你的问题。 - Sheldore
代码在我的安装中正常工作。 - 6502
1个回答

0

为了使您的代码正常工作,请使用更大的数据类型,例如(dtype="float64"),请编辑您的代码:

x = np.array(x_range, dtype="float64")

如果您想让这2个结果匹配精度,请添加 [0]

x = np.array(x_range, dtype="float64")[0]
x = np.array(x_range, dtype="float32")[0]

为了理解原因,请阅读下文:

如果您在代码中将公式更改为简单的公式,例如(formula=“x+100”),则会得到正确结果。

这意味着什么? 这意味着您的公式'1-((232-1)/232)**(x*(x-1)/2)'会导致numpy中的溢出,“numpy是用C构建的,而不是Python”。

我尝试了以下代码以缩小问题的可能性:

formula = '1-((2**32-1)/2**32)**(x*(x-1)/2)'
x = 80300
print(eval(formula))
x = np.array(range(80300, 80301))[0]
print(eval(formula))

Sublime Text 的输出>>>

0.5279390283223464
RuntimeWarning: overflow encountered in long_scalars
import numpy as np
-0.28319476138546906

这支持了我的观点


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接