2015-11-06 3 views
0

У меня есть два файла:Нормированные значения, когда суммированные более 1

Файл 1:

TOPIC:topic_0 1294 
    aa 234 
    bb 123 

    TOPIC:topic_1 2348 
    aa 833 
    cc 239 
    bb 233 

Файл 2:

0.1 0.2 0.3 0.4 

Это только формат моих файлов. В принципе, когда второй столбец (опускающий первую строку «TOPIC») суммируется для каждой темы, он составляет 1, так как они являются нормированными значениями. Аналогичным образом, в файле 2, значения нормированы и, следовательно, они также являются к 1.

я выполнить умножение значений из файла 1 и 2. Полученный выходной файл выглядит как:

aa 231 
bb 379 
cc 773 

г. Вторая столбец при суммировании выходного файла должен дать 1. Но мало файлов имеет значения чуть более 1, например 1.1, 1.00038. Как я могу точно получить 1 для выходного файла? Это какое-то округление, что я должен делать или что-то еще?

PS: Форматы - это просто примеры, значения и слова разные. Это просто для понимания целей. Пожалуйста, помогите мне разобраться.

ответ

1

Python хранит десятичные числа с плавающей запятой в базе-2.

https://docs.python.org/2/tutorial/floatingpoint.html

Это означает, что некоторые десятичные может быть прекращение в базе-10, но повторяют в базе-2, следовательно, ошибка с плавающей точкой, когда вы добавляете их.

Это вникает в математику, но представьте себе в базе 10, пытаясь выразить значение 2/6. Когда вы устраняете общие факторы из числителя и знаменателя, это 1/3.

Это 0.333333333 ..... повторяющийся навсегда. Я объясню, почему в какой-то момент, но пока, поймите, что если хранить только первые 16 цифр в десятичной системе, например, когда вы умножаете число на 3, вы не получите 1, вы получите .9999999999999999 , что немного не так.

Эта ошибка округления возникает всякий раз, когда имеется повторяющееся десятичное число.

Вот почему ваши цифры не повторяются в базе-10, но они повторяются в базе-2.

Десятичные числа находятся в базе-10, причем основные коэффициенты равны 2^1 * 5^1. Поэтому для любого отношения, которое должно заканчиваться в базе-10, его знаменатель должен составлять коэффициент до комбинации 2 и 5, а больше ничего.

Теперь вернемся к Python. Каждое десятичное число хранится как двоичное. Это означает, что для того, чтобы «десятичное» отношение было прекращено, знаменатель должен составлять только 2 и ничего больше.

Ваши номера повторяются в базе-2.

1/10 имеет (2 * 5) в знаменателе. 2/10 уменьшает до 1/5, которое по-прежнему имеет пять в знаменателе. 3/10 ... ну вы поняли.

+0

Вы можете немного продумать? Я начинающий программист. Извините за беспокойство! –

+0

Я написал свое объяснение ad-hoc, но я также связался с оригинальной документацией Python по теме, которая лучше отформатирована и спланирована. Если вы прочтете мой ответ и ответ на Python и все еще запутались, продолжайте и публикуйте еще один комментарий, и я попытаюсь уточнить. –

+0

Я понимаю концепцию. Итак, как мне избежать этого? –

Смежные вопросы