Расчет среднего массива Python 3 - PullRequest
0 голосов
/ 26 февраля 2019
x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1

avgc1= num1/den1
avgc2= num2/den2
val = (100* avgc1 / avgc2)
print(val)

Значение переменной val должно быть 200, но я получаю 199.99999999999997.Может кто-нибудь, пожалуйста, помогите мне понять причину.

В то же время, если я попробую следующее, он вернет 200.

y=4039.0
x1=y/3
x2=y/6
x3=100*x1/x2
print(x3)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

num1/den1 и num2/den2 вычисляются с использованием арифметики с плавающей точкой.Это включает округление точных математических результатов до значений, представляемых с плавающей точкой.

В результате avgc1 и avgc2 могут отличаться от их идеальных математических значений, как и их частное.

0 голосов
/ 26 февраля 2019

Я получаю 199.99999999999997 для обоих (Python версия 3.7.1).Проблема связана с ошибками округления в арифметике с плавающей запятой.

Вы можете сделать, как сказал @Josh Friedlander, и использовать двойное значение //, но это приведет к разделению по полу, что может не соответствовать вашим ожиданиям.Чтобы сохранить более высокую точность, вы можете попробовать использовать numpy для деления.

import numpy as np

y=4039
x1=np.divide(y,3)
x2=np.divide(y,6)
x3=100*np.divide(x1,x2)
print(x3)

Returns

200.0

Работает и для других случаев:

x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1

avgc1= np.divide(num1,den1)
avgc2= np.divide(num2,den2)
val = (100* np.divide(avgc1,avgc2))
print(val)

Returns

200.0

Для справки используется np.__version__ 1.15.4.

Редактировать

Как отметил @Mark Dickinson, порядок операций важен.Размещение скобок вокруг деления с чистым Python приведет к 200.0 без использования numpy.

x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1

avgc1= num1 / den1
avgc2= num2 / den2

# use parentheses to perform division first
val = (100* (avgc1 / avgc2))
print(val)
...