Как повысить точность вычисления чисел с плавающей точкой
Помогите, пожалуйста, решить следующую проблему: максимальная погрешность при вычислениях 10^(-9), в моем случае погрешность 10^(-8). То есть при входных данных — 3.568248230554, правильный ответ — 10, допустимый ответ 9,999999999, ответ, который получился 9.999999990, то есть мне не хватает точности в один разряд. Как повысить точность с использованием только встроенных модулей python?
import decimal from math import pi d = decimal.Decimal(input("Please enter the d: ")) s = decimal.Decimal(pi) * (d/2) * (d/2) print(s)
Отслеживать
Prosto_Oleg
задан 13 фев 2021 в 12:10
Prosto_Oleg Prosto_Oleg
366 1 1 серебряный знак 10 10 бронзовых знаков
Вычислил вашу формулу на C++, получил 9.9999999901826211 . Ваше утверждение, что правильный ответ 10 выглядит неправдоподобно.
13 фев 2021 в 12:21
Почему правильный ответ 10?
13 фев 2021 в 12:41
Спасибо всем за ответы. Скорее всего ответ округлили до 10, что ввело меня в заблуждение. Отдельное спасибо человеку, который проверил на С++, ведь именно такой ответ у меня и получился, однако округленный ответ от заказчика заставил меня думать, что ответ некорректный
13 фев 2021 в 12:59
Я дополнил ответ.
13 фев 2021 в 13:16
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Изучите внимательно документацию по модулю decimal . В том его фишка, что вы можете управлять точностью вычислений сами. Для этого есть атрибут контекста getcontext().prec .
Однако в вашем случае проблtма с точностью самого числа pi из модуля math или вашим числом 3.568248230554
Давайте проверим вместе.
Вот несколько знаков числа Пи:
3,14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 32823 06647 09384 46095 50582 23172 53594 08128 48111 74502 84102 70193 85211 05559 64462 29489 54930 38196 44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 45648 56692 34603 48610 45432 66482 13393 60726 02491 41273 72458 70066 06315 58817 48815 20920 96282 92540 91715 36436 78925 90360 01133 05305 48820 46652 13841 46951 94151 16094 33057 27036 57595 91953 09218 61173 81932 61179 31051 18548 07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 98336 73362 44065 66430 86021 39494 63952 24737 19070 21798 60943 70277 05392 17176 29317 67523 84674 81846 76694 05132 00056 81271 45263 56082 77857 71342 75778 96091 73637 17872 14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 42019 95611 21290 21960 86403 44181 59813 62977 47713 09960 51870 72113 49999 99837 29780 49951 05973 17328 16096 31859 50244 59455 34690 83026 42522 30825 33446 85035 26193 11881 71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 59825 34904 28755 46873 11595 62863 88235 37875 93751 95778 18577 80532 17122 68066 13001 92787 66111 95909 21642 01989
Вот результат decimal:
decimal.Decimal(pi) Out[10]: Decimal('3.141592653589793115997963468544185161590576171875')
в то время как настоящее число начинается так:
3.14159265358979323846264338327950288419716939937510
видно, что совпадает только 3.141592653589793
In [19]: pi = Decimal(3.14159265358979323846264338327950288419716939937510) In [20]: pi Out[20]: Decimal('3.141592653589793115997963468544185161590576171875') In [21]: pi = Decimal('3.14159265358979323846264338327950288419716939937510') In [22]: pi Out[22]: Decimal('3.14159265358979323846264338327950288419716939937510')
Дело в том, что в случае вычисления Decimal от float максимально возможная точность это точность float . А Decimal от str дает нужное количество цифр.
Но даже правильное pi не дает 10:
pi * (d/2) * (d/2) Out[23]: Decimal('9.999999990182621193277661430')
Значит — введенное d неверно. Вычислим его.
In [32]: dd = Decimal.sqrt(Decimal(10) / pi * 4) In [33]: dd Out[33]: Decimal('3.568248232305542229077932745') In [34]: pi * (dd/2) * (dd/2) Out[34]: Decimal('9.999999999999999999999999993')
В итоге — ваше d тоже вычислялось с точностью флоат. Более точно оно звучит как ‘3.568248232305542229077932745’. Тогда и результат будет поближе к 10.
Как повысить точность вещественного деления в среде C++?
При реализации логики калькулятора на языке С++ столкнулся с различием в точности с референсом.
В качестве референса был использован стандартный win32 (не UWP) калькулятор Windows 7 / 10.
Пример: деление 100 на 6.
Калькулятор Windows: 16,66666666666667
Стандартные средства C++: 16,6667
Использовалось и приведение и объявление double и long doule.
Вопрос: Какие есть методы приведение в эквивалентную точность в рамках стандартной библиотеки?
- Вопрос задан более года назад
- 151 просмотр
Как увеличить точность double C++?
Пытаюсь сделать одинаковое вычисление с помощью C++ чтобы точность была как в языке Ruby, однако C++ жестче округляет значения а делать round() для каждого прохода не вариант так как чисел после запятой может быть от 1 до 16, что посоветуете?
a = 3.2 b = 4.2 p = 8.3 puts ((a+b) * (p / 100)) # 0.6142000000000001
#include #include using namespace std; int main(void) < long double a = 3.2; long double b = 4.2; long double p = 8.3; cout
a = 9.809999999999999 b = 11.1 p = 8.3 puts ((a+b) * (p / 100)) # 1.7355299999999998
#include #include using namespace std; int main(void) < long double a = 9.809999999999999; long double b = 11.1; long double p = 8.3; cout
- Вопрос задан более трёх лет назад
- 5858 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1

Data Science
Не совсем корректно поставлен вопрос, тем что тебе нужно - ты понижаешь точность.
У float 23 мантисы, у double 52. Теоритически дабл имеет двухкратную точность в сравнении с float.
C++ жестче округляет значения
Это как понимать?
У тебя может быть до 16 чисел после запятой - это уже сильно округленно. Поставь себе конкретно вопрос - сколько именно чисел после запятой ты хочешь видеть в итоге? На столько и округляй.
Если же отвечать конкретно на формулировку твоего вопроса, а именно "как повысить точность", то 1 из ответов был бы long double
Как настроить оптимальную работу компьютерной мыши в Windows 10
Начиная от Повышенной точности установки указателя до DPI и скорости перемещения указателя – существует множество опций, которые влияют на то, как движется указатель мыши в Windows.
Повышенная точность установки указателя
Смысл настройки Включить повышенную точность установки указателя в Windows понятен не сразу. Однако, она действительно помогает сделать указатель мыши «более точным» в некоторых ситуациях, и более быстрым в других.

Эта функция является формой искусственного ускорения мыши. С её помощью контролируется, насколько быстро движется указатель, которое, в свою очередь, зависит от физического перемещения мыши.
Другими словами, если включена функция «Повышенной точности установки указателя, то курсор мыши перемещается дальше, когда вы перемещаете мышь быстрее, и на меньшее расстояние – когда вы перемещаете мышь медленнее, даже если вы перемещаете мышь на одинаковое расстояние.
Это может помочь при попытке точно выбрать мелкие элементы на экране. Тем не менее, это может сделать вашу мышь менее точной, потому что сложнее предвидеть, как далеко продвинется ваш курсор, особенно если вы быстро её перемещаете.
Стоит поэкспериментировать с этой настройкой, в зависимости от вашего оборудования и того, что вы делаете. Офисные работники с более дешевыми мышами и все, кто пользуется тачпадом ноутбука, могут захотеть оставить её включенной. Геймеры часто отключают эту настройку. У многих игровых мышей присутствуют физические кнопки, которые позволяют настраивать DPI на лету, что упрощает точное выделение небольших объектов, если это необходимо, без включения режима повышенной точности. Тем не менее, вам потребуется некоторое время, чтобы привыкнуть к новой настройке после её включения.
Вы можете включить или отключить эту настройку в Панели управления → Оборудование и звук → Мышь → Параметры указателя. Активируйте пункт «Включить повышенную точность указателя», а затем нажмите ОК , чтобы сохранить изменения.
Используйте клавиатуру для перемещения мыши
Для действительно тонкого управления указателям, Windows предлагает функцию «Управление мышью с клавиатуры», которая позволяет вам использовать цифровой блок клавиатуры для перемещения указателя мыши на один пиксель за раз. Если Вам не удаётся точно установить курсор мыши, вы можете использовать клавиатуру для окончательной настройки. К сожалению, функция не работает, если вы используете клавиатуру ноутбука без специального цифрового блока.
Чтобы включить и настроить управление указателем мыши с клавиатуры, перейдите в Панель управления → Специальные возможности → Урощение работы с мышью.

По умолчанию нажатие левой клавиши Alt + Shift + Num Lock включает и отключает управление указателем мыши с клавиатуры. Как только вы нажмете эту комбинацию, просто используйте цифровую клавиатуру с правой стороны, чтобы управлять курсором.
Оптимизируйте указатель мыши
Для точного управления перемещением указателя мыши вам нужно изменить несколько настроек. Доступны две основные настройки, которые вы можете изменить: скорость указателя и DPI.
Вы можете изменить скорость указателя для любой мыши в Windows. Это определяет, как далеко перемещается курсор мыши на экране при перемещении вашей физической мыши.
Чтобы изменить скорость указателя мыши, перейдите к той же панели управления мышью. Она находится на Панели управления → Оборудование и звук → Мышь. В Windows 10 вы также можете перейти в «Параметры» → «Устройства» → «Мышь» → «Дополнительные параметры мыши». Перейдите на вкладку «Параметры указателя» и настройте ползунок «Скорость движения указателя». Нажмите Применить , чтобы оценить изменения.

На некоторых мышах, особенно дорогих моделей, предназначенных для игр, вы также можете изменить DPI. Параметр DPI управляет тем, что мышь сообщает Windows, а затем Windows умножает этот параметр на скорость, чтобы контролировать, как далеко перемещается указатель.
Более высокий DPI с меньшей скоростью указателя может перемещаться примерно на с той же «скоростью» на экране, что и более низкий DPI с более высокой скоростью указателя, но более высокий DPI позволяет мыши лучше реагировать на небольшие движения и повышает точность. Однако, это не обязательно означает, что следует установить самую высокую настройку DPI.
Если ваша мышь позволяет настроить свой DPI, вы можете сделать это с помощью панели управления драйвером мыши, созданной производителем мыши. Если у вас ещё не установлена панель управления от производителя мыши, вам может потребоваться загрузить её с официального веб-сайта.
У некоторых мышей доступны кнопки, которые уменьшают и увеличивают DPI мыши, позволяя менять его на лету, чтобы соответствовать вашей ситуации. Это может быть очень полезно. Эта функция часто используется в онлайн-играх, поэтому распространена у игровых мышей, хотя также полезна для Photoshop или Call of Duty.

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