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

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

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

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

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

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

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

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

Арифметика - C++
Даны x,y,z. Вычислить a,b если <a target="_blank" href="http://***********/F/s50.***********/i127/0911/47/4bd25a960645.jpg.html"><img...

Целочисленная арифметика - C++
:wall:Очень нуждаюсь в помощи!!! Игрок А объявляет двузначное число от 01 до 99. Игрок В меняет местами его цифры и прибавляет полученное...

Длинная арифметика - C++
http://www.********/index.asp?main=task&id_task=103 Как решить эту задачу? С помощью чего, и в чем смысл решения длянной...

9
Somebody
2793 / 1604 / 148
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 3
26.07.2012, 18:09 #2
А в чём проблема? 10^(-15) - почти 0.
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 - точность
По этому причине как раз и накапливаются ошибки при дробной арифметике. Всё дело в машинном нуле
1
Catstail
Модератор
23040 / 11407 / 1859
Регистрация: 12.02.2012
Сообщений: 18,670
26.07.2012, 19:26 #4
Правильное сравнение чисел с плавающей точкой:

C++
1
2
  if (fabs(a-b) <= 1.0E-15) // для double
    ....
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
27.07.2012, 11:01 #5
Цитата Сообщение от mazaltz Посмотреть сообщение
Компилятор C++ Builder 6 выдает ответ -1.54737334057131E-15;
Помогите пожалуйста;
Жалко терять уже время;
Это не компилятор, а процессор, проблема в эпсилоне.
0
-=ЮрА=-
Заблокирован
Автор 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-х чисел и сравнивают его с малым которое определяет точность расчёта.
Также следует отметить, что машинное представление зачастую зависит от типа компилятора, думаю более старые компиляторы имели худшие в плане погрешности так сказать "пределы" для вещественных чисел.
0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Изображения
 
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 13:21 #8
http://www.cyberforum.ru/blogs/18334/blog88.html
1
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
27.07.2012, 14:17 #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Также следует отметить, что машинное представление зачастую зависит от типа компилятора, думаю более старые компиляторы имели худшие в плане погрешности так сказать "пределы" для вещественных чисел.
float аппаратный.
0
mazaltz
0 / 0 / 0
Регистрация: 12.02.2011
Сообщений: 13
27.07.2012, 18:02  [ТС] #10
Всем большое спасибо.
0
27.07.2012, 18:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 18:02
Привет! Вот еще темы с ответами:

Длинная арифметика - C++
Всем привет! Хотелось бы узнать -- есть ли в С++ библиотека, где реализованы операции над длинными числами?

«Целочисленная арифметика» - C++
Благодарен буду кто поможем с задачей Ниже. Не могу понять что и как вообще, в с ++ желательно Дано натуральное число N. Найти и...

Целочисленная арифметика - C++
Помогите пожалуйста в задаче: Найти количество натуральных двузначных чисел, каждое из которых делится на 3 и на 13. Найти те натуральные...

Длинная арифметика С++ - C++
требуется написать задачу для подсчета суммы s=1^2+2^2+3^2+...+n^2 n&gt;=20000


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

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

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