Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
 Аватар для Obi-Wan
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 94

Почему в python-e присутствует неточность арифметики вещественных чисел?

08.04.2018, 05:22. Показов 8801. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допусти есть выражение:
Python
1
2
>>> 0.1 + 0.1 + 0.1 - 0.3
>>> 5.551115123 и т.д
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2018, 05:22
Ответы с готовыми решениями:

Интерпретатор арифметики вещественных чисел
Программа получает на вход текстовый файл (в формате ASCII или ANSI) с текстом программы. На выходе – выводит на экран результаты...

Чтение матрицы из текстового файла в матрицу вещественных чисел numpy на Python
Добрый день! Нужна ваша помощь) Мне нужно прочитать текстовый файл состоящий из данных в таком виде (5 строк и 14 элементов в строке через...

Почему нет вещественных чисел размером менее 4 байт?
Бывает нужно число 1.5 или 1.75 даже по текущей методике оно бы могло в short поместиться, имеется в виду в 2 байта.

7
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.04.2018, 06:52
Лучший ответ Сообщение было отмечено Obi-Wan как решение

Решение

Существуют действительные числа, не имеющие точного представления. Попробуй записать точное значение 1/3 в виде десятичной дроби. Похожая ситуация и в машине с двоичной системой счисления, и дело здесь не в питоне.
1
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.04.2018, 14:33
Лучший ответ Сообщение было отмечено Obi-Wan как решение

Решение

Obi-Wan, для того, чтобы получать точный результат нужно использовать специальные типы
Python
1
2
3
from decimal import Decimal as d
d('0.1') + d('0.1') + d('0.1') - d('0.3')
Decimal('0.0')
1
 Аватар для Obi-Wan
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 94
09.04.2018, 10:52  [ТС]
Пожалуй понял, в устройствах есть ограничения объёма памяти вещественных чисел, поэтому будет неполное представление битов числа и выражение будет выполнено не точным.
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
09.04.2018, 13:17
Лучший ответ Сообщение было отмечено Obi-Wan как решение

Решение

Цитата Сообщение от Obi-Wan Посмотреть сообщение
ограничения объёма памяти вещественных чисел
Вопрос, скорее, в способе представления.

Вот простой пример: если работать с простыми дробями, то мы легко получим 1/3 + 1/3 + 1/3 = 1.
А на десятичном калькуляторе это будет 0.333333 + 0.333333 + 0.333333 = 0.999999
И даже если увеличить точность в 10 раз, ошибка станет меньше, но останется, потому что 1/3 в десятичных дробях точно не представляется в принципе, никаким числом знаков.

Так же и с представлением 0.1 (то есть 1/10) в виде двоичной дроби (как это всё хранится для float)

Замечу, что целые числа без дробей, а также дроби вида 0.5, 0.25 представляются в формате float точно (до каких-то пределов, конечно) и таких явных ошибок не дают
1
 Аватар для Obi-Wan
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 94
09.04.2018, 15:26  [ТС]
У Лутца сказано иначе. Спасибо!

Добавлено через 8 минут
У него так: "Вещественная арифметика страдает некоторой долей неточности из-за ограничения объёма памяти, выделяемого для хранения вещественных чисел.".

Добавлено через 1 час 26 минут
Я так и не понял. Ограничение памяти играет хоть какую-то роль?

Добавлено через 13 минут
Я так и не понял. Ограничение памяти играет хоть какую-то роль?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
09.04.2018, 16:00
Цитата Сообщение от Obi-Wan Посмотреть сообщение
У него так: "Вещественная арифметика страдает некоторой долей неточности из-за ограничения объёма памяти, выделяемого для хранения вещественных чисел.".
имеется в виду разрядность
Типы с плавающей точкой (float, double и long double)

Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.

Типы данных с плавающей точкой хранятся в памяти иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка.

В IBM PC-совместимых компьютерах величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка — его диапазон.
0
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
10.04.2018, 01:29
Цитата Сообщение от Obi-Wan Посмотреть сообщение
Ограничение памяти играет хоть какую-то роль?
Оно влияет на размер ошибки. Но речь же, я так понял, идёт о точном представлении результата?
Так вот, общепринятый способ представления чисел с плавающей точкой не позволяет точно представить 0.1, даже если мы выделим под мантиссу гигабайт. Ошибка станет очень мала, но она будет. И распространится на все вычисления с участием этого числа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2018, 01:29
Помогаю со студенческими работами здесь

Почему ввод с клавиатуры вещественных чисел в массив типа double терпит неудачу?
#include<stdio.h> int main(){ int size; scanf("%d",&size); int array; for(int i=0;i<size;i++){ scanf("%d",&array); } ...

Почему, если число 1 не является простым, верна основная теорема арифметики?
Почему если число 1 не является простым верна основная теорема арифметики? Если не ошибаюсь её можно сформулировать так: любое...

почему экспонент присутствует во всех распределениях
почему экспонента присутствует во всех распределениях? объясните мне пожалуйста

Почему Visual C++ Runtime не присутствует в системе по умолчанию?
Здравствуйте. Вопрос задаю возможно очень необычный, но меня терзает любопытство: почему при разработке плагинов/исполняемых файлов на С++...

Почему в некоторых Release сборках присутствует атрибут DebuggableAttribute?
Написал минипрограммку для проверки сборок на то, скомпилены ли они в Debug-конфигурации или нет, чтобы проверять ею потом свои сборки и не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru