Уравнение возвращает разные значения для одной и той же переменной - PullRequest
3 голосов
/ 31 марта 2019

Я пытаюсь создать график, но он выглядит неправильно. Для диапазона (0, 1000000) график должен начинаться с 0 и заканчиваться 1 на оси x, но он имеет отрицательные значения. В начале все в порядке, но после некоторого значения это становится неправильным.

Я попытался вручную вычислить конкретные значения и обнаружил, что для этого же значения в уравнении есть другой результат. Вот пример:

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 Ответ

0 голосов
/ 31 марта 2019

Чтобы ваш код работал правильно, используйте больший тип данных i.e (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]

Чтобы понять почему, прочитайте ниже:

если вы измените формулу в своем коде, например, на простую (формула = "x + 100"), вы получите правильные результаты

что это значит? это означает, что ваша формула '1 - ((2 32-1) / 2 32) ** (x * (x-1) / 2)' вызывает переполнение в numpy "numpy встроенный С не питоном "

я попробовал следующий код, чтобы сузить возможности проблемы:

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))

вывод из возвышенного текста >>>

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

которые поддерживают мою точку зрения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...