Набор чисел с плавающей точкой - PullRequest
0 голосов
/ 25 сентября 2018

Итак, я хочу создать набор чисел с плавающей запятой, где два числа считаются равными с учетом определенного допуска.Например, если у меня есть набор

a =  set([1, 2, 3])

, если я добавлю элемент 1.00001 с допуском 1e-4, результирующий набор должен быть

{1, 2, 3}

, а не

{1, 1.00001, 2, 3}

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Мне кажется, вы должны иметь возможность проверить каждый элемент, уже находящийся в наборе, и, если абсолютная разница между этим элементом и элементом, который вы пытаетесь добавить, меньше порогового значения, просто не добавляйте его.

Примерно так должно получиться:

def AddToSetWithThreshold(pSet, pValue, pThreshold):
    vList = [entry for entry in pSet if abs(pValue - entry) < pThreshold]
    if len(vList) == 0:
        pSet.add(pValue)

a = set([1, 2, 3]) ; print(a)
AddToSetWithThreshold(a, 1.00001, 1e-4) ; print(a)
AddToSetWithThreshold(a, 1.00001, 1e-6) ; print(a)

Поскольку первое добавление слишком близко к 1, а второе - нет, это приведет кв следующем выводе:

set([1, 2, 3])
set([1, 2, 3])
set([1, 2, 3, 1.00001])
0 голосов
/ 25 сентября 2018

Мы можем использовать функцию округления для проверки tolerance of 1e-4

a = set([1,2,3])
def add(number):
  if(round(number,4) not in a):
    a.add(number)


add(1)
print(a)
add(1.0000)
print(a)
add(1.0001)
print(a)
add(1.1)
print(a)
0 голосов
/ 25 сентября 2018

импорт математики и использование ceil

import math

decimals = 3

v = 1.234566789
print(math.ceil(v*pow(10,decimals))/pow(10,decimals))  
# 1.234

или, если вы хотите целое число типа «порог», просто используйте

print(float(int(v)))
# 1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...