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

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

Восстановить пароль Регистрация
 
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 17:37     Куда теряется точность? #1
Для примера, есть формула (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++ Точность и т.д.
C++ Теряется значение в переменной
C++ Теряется точность
C++ Точность float
Теряется указатель на переменые в классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
07.01.2013, 17:47     Куда теряется точность? #2
Представление вещественных чисел "на пальцах"
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2013, 18:06     Куда теряется точность? #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Зависит от компилятора, gcc действительно по умолчанию ведёт вычисления с двойной точностью, но в целом это далеко не обязательно.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:13  [ТС]     Куда теряется точность? #4
Цитата Сообщение от NoMasters Посмотреть сообщение
gcc действительно по умолчанию ведёт вычисления с двойной точностью
Как отключить, подскажете?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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
Ушёл с форума.
 Аватар для 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
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.01.2013, 18:31     Куда теряется точность? #7
Schizorb, чего ради? Производительность от этого меньше не становится, скорее даже наоборот, да и точность меньше теряется. А так -ffloat-store ЕМНИП.
Schizorb
 Аватар для Schizorb
508 / 460 / 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
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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++
C++ значение массива теряется
Теряется строка при передаче в функцию C++

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

Или воспользуйтесь поиском по форуму:
Schizorb
 Аватар для Schizorb
508 / 460 / 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     Куда теряется точность?
Ответ Создать тему
Опции темы

Текущее время: 15:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru