|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
Как обнаружить потерю точности при умножении двух double14.09.2025, 12:13. Показов 5727. Ответов 66
Добрый день,
Пытаюсь разобраться для себя с такими интересными тонкостями вещественной арифметики, как потеря точности и переполнения. Со сложением и вычитанием ясно: если одно из чисел не равно 0, а результат равен второму - значит произошла потеря точности. Но как быть с умножением? Ведь там при потери точности произведение будет равно не одному из множителей, а просто некоему неправильному числу???
0
|
|
| 14.09.2025, 12:13 | |
|
Ответы с готовыми решениями:
66
[Error] cannot convert 'double (*)(double)' to 'double' for argument '1' to 'double pow(double, double)' Найти все двузначные числа, которые при умножении на 2 заканчиваются на 8, а при умножении на 3 - на 4. Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" |
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||||||||||||
| 14.09.2025, 21:03 | |||||||||||||
|
Но в переменной уже сконвертированное неточное значение.
0
|
|||||||||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||
| 14.09.2025, 21:13 [ТС] | |||
|
0
|
|||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||||||
| 14.09.2025, 21:28 | |||||||
|
Но что она делает? Какое её назначение???
0
|
|||||||
|
-196 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 852
|
|
| 14.09.2025, 22:13 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||
| 14.09.2025, 22:27 [ТС] | |||
|
Поэтому 1.124d * 5.0005d не равно десятичному 5.620562 Я изучаю как ведут себя числа с плавающей точкой, а не их соответствие тому или иному десятичному числу. Пытаюсь понять, что означает "потеря точности" и как-то ее "пощупать". Пока то что я понял: Если порядок двух операндов сильно различается, то для выражения a * b = c не будет соблюдаться с / a = b. Т.е. результат произведения a и b математически точным не будет. В таких случаях double multiply(double a, double b) успешно выбрасывает исключения. И я наглядно увидел, что числами с плавающей точкой нужно пользоваться осторожно. Могут быть задачи, когда их применение неприемлемо. Для себя я запомнил это:
0
|
|||
| 14.09.2025, 22:30 | |||||||
1
|
|||||||
|
640 / 398 / 68
Регистрация: 09.03.2016
Сообщений: 4,404
|
|
| 14.09.2025, 22:34 | |
|
Хорошая разработка...
Премию вам всем не дадут? Нобелевскую... Где float хорошо ипользуеться - На винде... Веь звук float 32 бита.. Вот там точность точно пофигу...
0
|
|
|
640 / 398 / 68
Регистрация: 09.03.2016
Сообщений: 4,404
|
|
| 14.09.2025, 22:39 | |
|
0
|
|
|
5841 / 1599 / 127
Регистрация: 21.04.2013
Сообщений: 9,263
|
|||||||||||||||||||||
| 14.09.2025, 22:56 | |||||||||||||||||||||
|
ADnD,
Потеря точности при умножении double возникает, когда произведение требует больше значащих бит, чем позволяет формат IEEE 754 double (53 бита мантиссы). Это приводит к округлению младших разрядов. Когда вы умножаете два числа double c = a * b, экспоненты складываются: exp_c = exp_a + exp_b, мантиссы перемножаются: mant_c = mant_a * mant_b, получается число до 106 бит. Результат округляется до 53 бит. Даже умножение 1.1 на 1.1 дает не точный результат:
2
|
|||||||||||||||||||||
|
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,065
|
|||||||
| 14.09.2025, 23:58 | |||||||
Нужно сперва проверять. Например, вот проверка для float и double. Пока не выведется true, бессмысленно говорить об этом формате.
1
|
|||||||
|
Супер-модератор
|
|
| 15.09.2025, 06:05 | |
Сообщение было отмечено ADnD как решение
Решение
А что значит, "потеря точности при умножении"? Я с этим не сталкивался. Пусть мантисса имеет m разрядов. При умножении двух чисел сначала перемножатся мантиссы. При этом самое страшное - потеря одного бита (0.1... * 0.1... = 0.01...) а потом сложатся порядки (на точность это никак не отразится).
Пользуясь случаем, рекомендую свою (длинную!) лекцию о плавающей точке вот или .
3
|
|
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||
| 15.09.2025, 11:18 [ТС] | ||
|
Большое спасибо всем ответившим, в особенности Igor3D, Storm Screamer, RoyalX и Catstail. Теперь у меня достаточно материала для изучения и нет необходимости "изобретать велосипед"!
![]() Кликните здесь для просмотра всего текста
Точность сохранена.
a = -1.7976900000000001e+308 b = 9.9999999999999991e-308 a*b (double) = -17.976900000000001 a*b (long double) = -17.976900000000000546 Решил посмотреть в работе вариант 2 через Boost.Multiprecision. Поставил актуальную версия 1.89.0 Возникла проблема с std::abs(precise - dc_precise). Visual Studio не находит перегруженную функцию для заданного типа аргумента (cpp_dec_float_50???). Какую библиотеку подключить?
0
|
||
|
353 / 151 / 10
Регистрация: 19.07.2024
Сообщений: 867
|
|
| 15.09.2025, 11:24 | |
|
Если так страшна эта потеря точности, то может вообще перейти на fixed point в расчётах?
0
|
|
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||
| 15.09.2025, 11:57 [ТС] | ||
|
0
|
||
|
-196 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 852
|
||||||||||||
| 15.09.2025, 14:04 | ||||||||||||
|
он такой:
0
|
||||||||||||
|
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,065
|
||
| 15.09.2025, 14:36 | ||
[YOUTUBE]w1XvJnx-ggQ[/YOUTUBE]Кликните здесь для просмотра всего текста
а если нужно с 14 секунды: [YOUTUBE=14]w1XvJnx-ggQ[/YOUTUBE]Кликните здесь для просмотра всего текста
И будет хорошим тоном брать видео в спойлер, чтобы при загрузке страницы не тормозило. Кому надо, тот раскроет спойлер. Catstail, и на видео у вас опечатка. На 2:20 вы объясняете, что 1E-8 это 0,000000001, но на самом деле для 1E-8 после запятой нужно 7 нулей, поскольку нотация 1E-8 означает 1*10^(-8). Советую просто перезалить видео, предварительно заменив этот кусок.
1
|
||
|
6701 / 3120 / 1064
Регистрация: 01.06.2021
Сообщений: 12,065
|
|
| 15.09.2025, 15:05 | |
|
Catstail, прикольная лекция, очень доступно всё объясняете. Порой бывают люди, которые знают много, но другим нормально объяснять не умеют. А у вас прям педагогический талант
1
|
|
|
5841 / 1599 / 127
Регистрация: 21.04.2013
Сообщений: 9,263
|
|
| 15.09.2025, 15:39 | |
|
В финансовых расчетах используют тип данных decimal, чтобы избежать потерь. Но в С++, в стандарте по крайней мере, его нет.
0
|
|
| 15.09.2025, 15:39 | |
|
Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Создать функцию с параметрами GetFunctionValue(double& a, double& b, double& c, double& x)... Реализовать в виде GetFunctionValue(double& a, double& b, double& c, double& x) Реализовать в виде GetFunctionValue(double& a, double& b, double& c, double& x) Реализовать в виде GetFunctionValue(double& a, double& b, double& c, double& x) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|