|
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 60
|
|
Точность чисел с плавающей точкой/запятой10.05.2025, 02:32. Показов 3625. Ответов 42
Метки нет (Все метки)
Добрый день!
Имеется массив чисел типа double от 1.000 до 10.000. Каждое число задано с точность до 10^-3. Также есть метод, который принимает число и возвращает ближайшее большее к нему число из этого массива. Всё работает хорошо, кроме одного числа - 1.6, которое всегда возвращается, собственно, не как 1.6, а как 1.6000000000000003. Я понимаю, что с числами с плавающей точкой/запятой не всё так просто, как может показаться на первый взгляд, но всё-таки: - почему это так работает? Причём только с этим числом. Все остальные возвращаются такими, какими они заданы в массиве; - возможно ли от этого избавиться без применения округлений, обрезаний и прочих инструментов?
0
|
|
| 10.05.2025, 02:32 | |
|
Ответы с готовыми решениями:
42
|
|
Native x86
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
|
||||
| 10.05.2025, 03:07 | ||||
|
0
|
||||
|
|
|||
| 10.05.2025, 04:18 | |||
|
Не по теме: Технически человечество очень сильно провмыкало, когда приняло десятеричную систему. Для более комфортной цифровизации стоило взять либо восьмеричную, либо шестнадцетеричную. Понятное дело что никто и никогда уже не уйдет от этого (в обозримом будущем точно). Работает медленней, но зато правильно работает в десятичном формате. Для финансов рекомендуют использовать этот формат. Для просчета графики в играх уже не шибко подходит, т.к. там нужно просчитывать очень много за очень короткое время.
1
|
|||
|
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 60
|
|||
| 10.05.2025, 15:40 [ТС] | |||
|
0
|
|||
|
|
||
| 10.05.2025, 16:34 | ||
|
p.s. 99% это явно было не про decimal. Плюс вам нужна точность до третьего знака, а проблемы начинаются после шестнадцатого. Вам нужно будет очень много операций, чтобы накопить ощутимую погрешность.
0
|
||
|
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 60
|
||
| 10.05.2025, 17:20 [ТС] | ||
|
0
|
||
|
|
|
| 10.05.2025, 17:36 | |
|
power_factor, округлять не рационально в этом случае.
Дробные числа принято сравнивать с некоторой, заранее установленной точностью. Округлением числа для "показа" занимается форматирование вывода, оставляя при этом само дробное число не измененным. Добавлено через 1 минуту Более того - округление округлению рознь. Либо округлять по всем математическим законам, либо просто нужно отбросить n-ное кол-во знаков после запятой..
0
|
|
|
|
|
| 10.05.2025, 18:52 | |
|
power_factor, Nope.
Есть конкретная прикладная задача, и под неё выбирают подходящий тип данных. Примеры указывал выше. Универсального решения не существует, в противном случае у нас бы существовал единый формат с плавающей точкой.
0
|
|
|
|
||||||
| 11.05.2025, 01:48 | ||||||
|
power_factor,
0
|
||||||
|
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 60
|
|||||||
| 11.05.2025, 15:20 [ТС] | |||||||
0
|
|||||||
|
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
|
||||||||||||
| 11.05.2025, 17:14 | ||||||||||||
Более явным образом если:
0
|
||||||||||||
|
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
|
||||||
| 11.05.2025, 18:27 | ||||||
|
Есть, кстати, ещё такой формат:
0
|
||||||
|
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 60
|
|||
| 11.05.2025, 22:50 [ТС] | |||
|
0
|
|||
|
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
|
||
| 11.05.2025, 23:29 | ||
|
Более того, даже если вы округлите или как-то приведёте выход своего метода к нужному вам числу, точно такие же "ошибки" float-вычислений могут появиться в вашей последующей "куче методов". Это борьба с ветряными мельницами. Ну и если всё равно нет покоя, то надо проводить тесты и смотреть, когда и при каких условиях эта ошибка может накопиться и стать хоть сколько-нибудь заметной. Тогда уже предпринимать какие-либо действия. Или не предпринимать.
0
|
||
|
|
||
| 12.05.2025, 00:18 | ||
|
Именно поэтому я говорю что "нужно отталкиваться от задачи", а не пытаться найти идеально решение для всех случаев. Если бы оно существовало, давно бы уже всем было известно и применялось.
0
|
||
|
Заблокирован
|
|||
| 12.05.2025, 01:52 | |||
|
Ваше число уже и так максимально близкое к исходному. Ничего предпринимать не нужно. Ага. Чудеса математики.
0
|
|||
|
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 962
|
||
| 12.05.2025, 08:01 | ||
|
это же не погрешность вычисления, а погрешность представления чисел в машинном виде. ничего вы с этим не сделаете, а то что ошибка может накопиться при вычислениях, или потеря точности может все поломать, когда в теории алгоритм очевидно должен работать - это один из важных предметов раздела математики "численные методы", обычно вроде первые главы этой теме и посвящены. если вы проводите какие-то большие математические расчеты, решаете дифуры, суммируете ряды и прочее, то точно заподозрите что не все так просто, но в бытовых ситуациях вам почти всегда будет хватать дабла. а про то, что точность может потеряться нужно просто помнить. проблемы чаще всего возникнут, если вычислять разность двух примерно одинаковых чисел, или сумму очень большого и очень маленького числа. так же не забывайте что есть и ошибки типа переполнения, или есть явление расширения до int32 (размера регистра) при промежуточных вычислениях и наверняка еще много всего с чем можно столкнуться.
0
|
||
|
|
|
| 12.05.2025, 10:55 | |
|
На самом деле, гипотетически обеспечить приемлемую точность - нормальное желание, однако здесь нужно не вдаваться в "фанатизм" и действовать в рамках разумного..
Так, на пальцах может и не совсем понятно, поэтому проще привести более-менее реальный пример. Немного посчитаем: Предположим, у нас есть ролик (барабан) диаметром 1м, и мы по нему прокатываем бесконечную веревку, делая при этом ровно 1 миллион оборотов. Мы хотим точно узнать - какую длину этой веревки мы протащили через барабан. Для начала, для вычисления длины окружности барабана мы возьмем ПИ с 6-ю знаками: 3,141592т.о. L = 3.141592 * 1 = 3.141592 метра / оборот. Миллион оборотов: 3.141592 * 106 = 3 141 592 метра.Теперь берем ПИ с 10-ю знаками: 3,1415926535L = 3,1415926535 метра / оборот. Миллион оборотов: 3.1415926535 * 106 = 3 141 592.6535 метра.Погрешность составила около 2,08 * 10-7 или всего 2,08 * 10-5%. Для такой дистанции это весьма очень мало! Поэтому, например, в небесной механике или в астрономических расчетах (траекторий полетов, орбит) принимают всего 5-6 знаков числа ПИ - этого достаточно вполне. Погрешность настолько мала, что ей можно пренебречь..
1
|
|
| 12.05.2025, 10:55 | |
|
Помогаю со студенческими работами здесь
20
Хранение чисел с плавающей запятой в памяти
число с плавающей точкой Числа с плавающей точкой Введение данных с плавающей точкой в TextBox Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|