Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

07.01.2013, 17:37. Просмотров 500. Ответов 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2013, 17:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Куда теряется точность? (C++):

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

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

Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) - C++
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой...

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

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

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

9
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
07.01.2013, 17:47 #2
Представление вещественных чисел "на пальцах"
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
07.01.2013, 18:06 #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Зависит от компилятора, gcc действительно по умолчанию ведёт вычисления с двойной точностью, но в целом это далеко не обязательно.
1
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:13  [ТС] #4
Цитата Сообщение от NoMasters Посмотреть сообщение
gcc действительно по умолчанию ведёт вычисления с двойной точностью
Как отключить, подскажете?
0
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 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
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2013, 18:29 #6
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Точней как раз дабл, а не флоат.

Добавлено через 9 минут
Цитата Сообщение от Schizorb Посмотреть сообщение
Как откличить, подскажете?
Выполнить вычисления дважды с бесконечной дробью в истинном значении какого нибудь промежуточного результата, один раз с даблами и привести к флоату только ответ, а входные данные из флоата в дабла, а второй раз с флоатами, потом результаты ещё раз привести к даблу, вычесть и разность сравнить с нолём по
C++
1
==
, или по
C++
1
!=
. Если компилятор делает также всегда, то ответы совпадут.
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
07.01.2013, 18:31 #7
Schizorb, чего ради? Производительность от этого меньше не становится, скорее даже наоборот, да и точность меньше теряется. А так -ffloat-store ЕМНИП.
0
Schizorb
510 / 462 / 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 Посмотреть сообщение
чего ради?
Просто чтоб понять)
0
Kastaneda
Jesus loves me
Эксперт С++
4688 / 2892 / 236
Регистрация: 12.12.2009
Сообщений: 7,354
Записей в блоге: 2
Завершенные тесты: 1
07.01.2013, 18:59 #9
Цитата Сообщение от Schizorb Посмотреть сообщение
А вот приведение к float ничего не дало почему-то (gcc 4.6.1)
А на liveworkspace.org результаты совпали. Там тоже версия 4.6 и 64битная ОС.
1
Schizorb
510 / 462 / 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;
0
07.01.2013, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 19:09
Привет! Вот еще темы с ответами:

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

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

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

Точность в double - C++
Добрый день Мне задали сделать проект в универе - Калькулятор с великой точностю. Я уже почти его сделал, но у меня возникла...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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