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

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

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

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

26.07.2012, 18:03. Просмотров 505. Ответов 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++
Даны x,y,z. Вычислить a,b если <a target="_blank" href="http://***********/F/s50.***********/i127/0911/47/4bd25a960645.jpg.html"><img...

Арифметика в C - C++
Дано натуральное число n. Проверить содержит ли оно три одинаковые цифры. Например 12322. Содержит. Помогите плиз...:(

Арифметика! - C++
Дано натуральное число n. Вычислить: (1+1/1*1)+(1+1/2*2)+(1+1/3*3)+...+(1+1/n*n) Скажу всем спасибо!

Арифметика. - C++
Для заданного целого числа N определить цифру а, наиболее часто встречающуюся в числе (задача целочисленной арифметики)Как задать кол-во...

целочисленная арифметика c++ - C++
Как сравнивать цифры в числе который находиться в массиве???

Длинная арифметика - C++
class BigInt { static const int max_size = 100000;//количество десятичных разрядов, которые должно вмещать static...

длинная арифметика - C++
решите задачку: пользователь вводит 2 больших числа (числа от -1*2^127 до 1*2^127-1). Написать программу для суммирования таких чисел.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 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
Модератор
22514 / 10919 / 1774
Регистрация: 12.02.2012
Сообщений: 18,066
26.07.2012, 19:26     Занимательная арифметика #4
Правильное сравнение чисел с плавающей точкой:

C++
1
2
  if (fabs(a-b) <= 1.0E-15) // для double
    ....
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.07.2012, 13:21     Занимательная арифметика #8
http://www.cyberforum.ru/blogs/18334/blog88.html
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++
Помогите пожалуйста в задаче: Найти количество натуральных двузначных чисел, каждое из которых делится на 3 и на 13. Найти те натуральные...

Арифметика класса - C++
Есть вот такое задание: Разработать и реализовать в виде методов операции над объектами класса: сложение, вычитание, умножение,...

Адресная арифметика - C++
Почему не работает данная программа? По идее после применения постфиксного инкремента у меня в указателе в конце p должен храниться адрес...

Адресная арифметика - C++
Здравствуйте! Изучал я тут, значится, на досуге функции с переменным числом параметров. Тема, казалось бы, элементарная, но у меня она...


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

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

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