С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1

Куда теряется точность?

07.01.2013, 17:37. Показов 1516. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для примера, есть формула (a+b)3 - a3. В расчетах с хранением промежуточных результатов и без него получаются разные ответы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cmath>
 
int main()
{
    float a = 10.0f, b = 0.01f, c, d;  
    float res1, res2;
    
    // Используем вспомогательные переменные
    c = (a + b) * (a + b) * (a + b);
    d = a * a * a;
    res1 = c - d;
 
    // Без вспомогательных переменных
    res2 = (a + b) * (a + b) * (a + b) - a * a * a;
    
    // Печатаем результат
    std::cout << "res1 = " << std::fixed << res1 << "\n";
    std::cout << "res2 = " << std::fixed << res2 << "\n";
    
    return 0;
}
Code
1
2
res1 = 3.002991
res2 = 3.003001
В чем фишка? Арифметические операции над float выполняются с приведением к double?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2013, 17:37
Ответы с готовыми решениями:

Теряется точность
Видимо в этой проге теряетмя точность. Не проходит только 1 тест. #include &lt;iostream&gt; #include &lt;iomanip&gt; using...

Теряется точность в сравнении с exel
Точность измерений на С++ меньше чем на exel. Нужно это исправить. Код проги #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Теряется точность при вычислении с double
Доброго времени суток. В процессе решения кубического уравнения, у меня теряется точность переменной типа double. Пробовал использовать...

9
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
07.01.2013, 17:47
Представление вещественных чисел "на пальцах"
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
07.01.2013, 18:06
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Зависит от компилятора, gcc действительно по умолчанию ведёт вычисления с двойной точностью, но в целом это далеко не обязательно.
1
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
07.01.2013, 18:13  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
gcc действительно по умолчанию ведёт вычисления с двойной точностью
Как отключить, подскажете?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.01.2013, 18:17
Можно так сделать
C++
1
res2 = float(float(a + b) * float(a + b) * float(a + b) - float(a * a * a));
результат http://liveworkspace.org/code/1APNRt
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.01.2013, 18:29
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Точней как раз дабл, а не флоат.

Добавлено через 9 минут
Цитата Сообщение от Schizorb Посмотреть сообщение
Как откличить, подскажете?
Выполнить вычисления дважды с бесконечной дробью в истинном значении какого нибудь промежуточного результата, один раз с даблами и привести к флоату только ответ, а входные данные из флоата в дабла, а второй раз с флоатами, потом результаты ещё раз привести к даблу, вычесть и разность сравнить с нолём по
C++
1
==
, или по
C++
1
!=
. Если компилятор делает также всегда, то ответы совпадут.
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
07.01.2013, 18:31
Schizorb, чего ради? Производительность от этого меньше не становится, скорее даже наоборот, да и точность меньше теряется. А так -ffloat-store ЕМНИП.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
07.01.2013, 18:46  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Точней как раз дабл, а не флоат.
Так и я о том же.

Цитата Сообщение от NoMasters Посмотреть сообщение
А так -ffloat-store ЕМНИП.
Да, помогло. Еще с флагом оптимизации -O1 получился тот же результат. А вот приведение к float ничего не дало почему-то (gcc 4.6.1)
Цитата Сообщение от Kastaneda Посмотреть сообщение
res2 = float(float(a + b) * float(a + b) * float(a + b) - float(a * a * a));
Цитата Сообщение от NoMasters Посмотреть сообщение
чего ради?
Просто чтоб понять)
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.01.2013, 18:59
Цитата Сообщение от Schizorb Посмотреть сообщение
А вот приведение к float ничего не дало почему-то (gcc 4.6.1)
А на liveworkspace.org результаты совпали. Там тоже версия 4.6 и 64битная ОС.
1
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
07.01.2013, 19:09  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
А на liveworkspace.org результаты совпали
Да, я видел. Но там одинаковые результаты и без приведения.

C++
1
res2 = (a + b) * (a + b) * (a + b) - a * a * a;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.01.2013, 19:09
Помогаю со студенческими работами здесь

Теряется точность переменной типа double
Вот код: double StepC = 0.001, g_C; for ( double c = StepC; c &lt;= 3; c += StepC ) { //...

Подскажите куда теряется строка
Пытаюсь вывести суммы строк. Выдает все кроме последней, как ее достать никак не соображу.type MyArr = array of array of integer; ...

Double - Куда девается точность?
Здравствуйте, встретился с такой проблемой. У пишу рулетку, Бюджет 2$, когда делаю ставку по 0,10$ то с бюджета вычитается, но когда...

Как определить, куда теряется траффик пользователей на сайт?
Привет, Подскажите, упал резко траффик на сайте, я предпологаючто сезон отпусков, большая часть на море, Пингую сайт с ...

Вычислить сумму с точность до e. Точность достигается, когда очередное слагаемое получается <= e
Вычислить сумму с точность до e. Точность достигается, когда очередное слагаемое получается &lt;= e.


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru