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

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

Войти
Регистрация
Восстановить пароль
 
mazaltz
0 / 0 / 0
Регистрация: 12.02.2011
Сообщений: 13
#1

Занимательная арифметика - C++

26.07.2012, 18:03. Просмотров 491. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
double g, f, x;
g = 0.01;
f = 47.11;
x = f - g*4711;
Компилятор C++ Builder 6 выдает ответ -1.54737334057131E-15;
Помогите пожалуйста;
Жалко терять уже время;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 18:03     Занимательная арифметика
Посмотрите здесь:

Арифметика C++
Арифметика в C C++
C++ Арифметика.
Арифметика! C++
C++ длинная арифметика
C++ Длинная арифметика
C++ целочисленная арифметика c++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
26.07.2012, 18:09     Занимательная арифметика #2
А в чём проблема? 10^(-15) - почти 0.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.07.2012, 18:13     Занимательная арифметика #3
mazaltz, Somebody прав. Никогда не слышал о том, что дробные числа лучше не сравнивать таким образом :
C++
1
2
double a = 1.0, b = 1.0;
if (a==b) // есть шанс, что не равны, даже если сделаем перед этим a=b;
нужно делать так:
C++
1
if (fabs(a-b) < E) // где E - точность
По этому причине как раз и накапливаются ошибки при дробной арифметике. Всё дело в машинном нуле
Catstail
Модератор
 Аватар для Catstail
21775 / 10499 / 1704
Регистрация: 12.02.2012
Сообщений: 17,499
26.07.2012, 19:26     Занимательная арифметика #4
Правильное сравнение чисел с плавающей точкой:

C++
1
2
  if (fabs(a-b) <= 1.0E-15) // для double
    ....
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.07.2012, 11:01     Занимательная арифметика #5
Цитата Сообщение от mazaltz Посмотреть сообщение
Компилятор C++ Builder 6 выдает ответ -1.54737334057131E-15;
Помогите пожалуйста;
Жалко терять уже время;
Это не компилятор, а процессор, проблема в эпсилоне.
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2012, 12:59     Занимательная арифметика #6
mazaltz, ты с толкнулся с проблемой машинного представления числа, поясню для нашей железяки которой является ЭВМ глубоко побарабану различие между числами ниже 15 степени т.е для неё хоть 4711 + 1e-15 хоть 4711 - 1e-15 одно и тоже, вот поэтому такой казус и получился. Могли вычитаться скажем (47.11 + 1e-15) и (47.11 - 1e-15) вот как раз почти 2е-15 и вылезло. Проблема знамая и для её решения идут на некоторые ухищрения при сравнении чисел с плавающей точкой - отдельно сравнивают целые части и дробные, либо как было показано выше находят модуль разности 2-х чисел и сравнивают его с малым которое определяет точность расчёта.
Также следует отметить, что машинное представление зачастую зависит от типа компилятора, думаю более старые компиляторы имели худшие в плане погрешности так сказать "пределы" для вещественных чисел.
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2012, 13:04     Занимательная арифметика #7
Ниже наглядный пример для компилятора VisualStudio 6.0 (прошу обратить внимание на 47,11 в машинном представлении - как раз то о чём говорил выше)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    double g, f, x;
    g = 0.01;
    f = 47.11;
    x = f - g*4711;
    printf("g = %.15f\n",g);
    printf("f = %.15f\n",f);
    printf("x = %.15f\n",x);
    getchar();
    return 0;
}
Изображения
 
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,406
27.07.2012, 13:21     Занимательная арифметика #8
http://www.cyberforum.ru/blogs/18334/blog88.html
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.07.2012, 14:17     Занимательная арифметика #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Также следует отметить, что машинное представление зачастую зависит от типа компилятора, думаю более старые компиляторы имели худшие в плане погрешности так сказать "пределы" для вещественных чисел.
float аппаратный.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 18:02     Занимательная арифметика
Еще ссылки по теме:

Длинная арифметика C++
Адресная арифметика C++
Адресная арифметика C++
C++ Длинная арифметика
C++ Длинная арифметика

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

Или воспользуйтесь поиском по форуму:
mazaltz
0 / 0 / 0
Регистрация: 12.02.2011
Сообщений: 13
27.07.2012, 18:02  [ТС]     Занимательная арифметика #10
Всем большое спасибо.
Yandex
Объявления
27.07.2012, 18:02     Занимательная арифметика
Ответ Создать тему
Опции темы

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