Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
1

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

07.01.2013, 17:37. Просмотров 571. Ответов 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
Ответы с готовыми решениями:

Теряется точность
Видимо в этой проге теряетмя точность. Не проходит только 1 тест. #include...

Теряется точность в сравнении с exel
Точность измерений на С++ меньше чем на exel. Нужно это исправить. Код проги ...

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

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

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

9
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,590
Записей в блоге: 2
Завершенные тесты: 1
07.01.2013, 17:47 2
Представление вещественных чисел "на пальцах"
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
07.01.2013, 18:06 3
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Зависит от компилятора, gcc действительно по умолчанию ведёт вычисления с двойной точностью, но в целом это далеко не обязательно.
1
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
07.01.2013, 18:13  [ТС] 4
Цитата Сообщение от NoMasters Посмотреть сообщение
gcc действительно по умолчанию ведёт вычисления с двойной точностью
Как отключить, подскажете?
0
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3017 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 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
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
07.01.2013, 18:29 6
Цитата Сообщение от Schizorb Посмотреть сообщение
Арифметические операции над float выполняются с приведением к double?
Точней как раз дабл, а не флоат.

Добавлено через 9 минут
Цитата Сообщение от Schizorb Посмотреть сообщение
Как откличить, подскажете?
Выполнить вычисления дважды с бесконечной дробью в истинном значении какого нибудь промежуточного результата, один раз с даблами и привести к флоату только ответ, а входные данные из флоата в дабла, а второй раз с флоатами, потом результаты ещё раз привести к даблу, вычесть и разность сравнить с нолём по
C++
1
==
, или по
C++
1
!=
. Если компилятор делает также всегда, то ответы совпадут.
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
07.01.2013, 18:31 7
Schizorb, чего ради? Производительность от этого меньше не становится, скорее даже наоборот, да и точность меньше теряется. А так -ffloat-store ЕМНИП.
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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
Эксперт С++
4940 / 3017 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 1
07.01.2013, 18:59 9
Цитата Сообщение от Schizorb Посмотреть сообщение
А вот приведение к float ничего не дало почему-то (gcc 4.6.1)
А на liveworkspace.org результаты совпали. Там тоже версия 4.6 и 64битная ОС.
1
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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

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

Теряется указатель на переменые в классе
образован двусвязный список. Данные находятся в трех перменныех, посел...

String to float - теряется разрядность
Врем привет пытаюсь преобразовать текстовую переменную в float и прибавить...


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

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

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