Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
#1

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

07.01.2013, 17:37. Просмотров 464. Ответов 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;
}
Код
res1 = 3.002991
res2 = 3.003001
В чем фишка? Арифметические операции над float выполняются с приведением к double?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2013, 17:37     Куда теряется точность?
Посмотрите здесь:

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

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

значение массива теряется - C++
Добрый день. Объясните пожалуйста почему значение массива теряется. И как сделать что бы он все таки вывел правильное значение? ...

Теряется значение в переменной - C++
Всем привет...думаю всем не важно что надо сдавать мне и так далее :D В общем прошу помощи...есть функция, возвращающая номер столбца с...

Теряется указатель на переменые в классе - C++
образован двусвязный список. Данные находятся в трех перменныех, посел поступления данных в функцию sAge указатели на перменные типа char...

Точность и т.д. - C++
1)Дано два целых числа a і b. Виведите гипотенузу с катетами a и b с точностью 6 знаков. Вх одные данные Два целих числа a и b (0 &lt; a,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 17:47     Куда теряется точность? #2
Представление вещественных чисел "на пальцах"
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
07.01.2013, 18:06     Куда теряется точность? #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Зависит от компилятора, gcc действительно по умолчанию ведёт вычисления с двойной точностью, но в целом это далеко не обязательно.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:13  [ТС]     Куда теряется точность? #4
Цитата Сообщение от NoMasters Посмотреть сообщение
gcc действительно по умолчанию ведёт вычисления с двойной точностью
Как отключить, подскажете?
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:17     Куда теряется точность? #5
Можно так сделать
C++
1
res2 = float(float(a + b) * float(a + b) * float(a + b) - float(a * a * a));
результат http://liveworkspace.org/code/1APNRt
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2013, 18:29     Куда теряется точность? #6
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Точней как раз дабл, а не флоат.

Добавлено через 9 минут
Цитата Сообщение от Schizorb Посмотреть сообщение
Как откличить, подскажете?
Выполнить вычисления дважды с бесконечной дробью в истинном значении какого нибудь промежуточного результата, один раз с даблами и привести к флоату только ответ, а входные данные из флоата в дабла, а второй раз с флоатами, потом результаты ещё раз привести к даблу, вычесть и разность сравнить с нолём по
C++
1
==
, или по
C++
1
!=
. Если компилятор делает также всегда, то ответы совпадут.
NoMasters
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,120
07.01.2013, 18:31     Куда теряется точность? #7
Schizorb, чего ради? Производительность от этого меньше не становится, скорее даже наоборот, да и точность меньше теряется. А так -ffloat-store ЕМНИП.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:46  [ТС]     Куда теряется точность? #8
Цитата Сообщение от 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 Посмотреть сообщение
чего ради?
Просто чтоб понять)
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:59     Куда теряется точность? #9
Цитата Сообщение от Schizorb Посмотреть сообщение
А вот приведение к float ничего не дало почему-то (gcc 4.6.1)
А на liveworkspace.org результаты совпали. Там тоже версия 4.6 и 64битная ОС.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 19:09     Куда теряется точность?
Еще ссылки по теме:

Теряется строка при передаче в функцию - C++
Привет Замучался копать уже. Теряется строка при передаче её в функцию. Код такой: char* Read() { char str = &quot;1 2 3 4&quot;; ...

Заданная точность - C++
Как сделать что бы числовой ряд считался с заданной точностью?

Точность вычислений - C++
Для проверки точности вычислений существуют формулы и калькулятор на 200000 знаков до и после запятой. Проверяются любые вычисленные...

повышенная точность - C++
Приветствую всех. Господа, подскажите где может быть косяк? Задача по геодезии, поэтому практически все значения double, в том числе и...


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

Или воспользуйтесь поиском по форуму:
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 19:09  [ТС]     Куда теряется точность? #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
А на liveworkspace.org результаты совпали
Да, я видел. Но там одинаковые результаты и без приведения.

C++
1
res2 = (a + b) * (a + b) * (a + b) - a * a * a;
Yandex
Объявления
07.01.2013, 19:09     Куда теряется точность?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru