Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 12.02.2011
Сообщений: 13
1

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

26.07.2012, 18:03. Просмотров 632. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2012, 18:03
Ответы с готовыми решениями:

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

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

Арифметика
Даны x,y,z. Вычислить a,b если <a target="_blank"...

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

9
2818 / 1628 / 252
Регистрация: 03.12.2007
Сообщений: 4,223
26.07.2012, 18:09 2
А в чём проблема? 10^(-15) - почти 0.
0
187 / 180 / 25
Регистрация: 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
Модератор
Эксперт Python
26646 / 13897 / 2642
Регистрация: 12.02.2012
Сообщений: 22,780
Записей в блоге: 1
26.07.2012, 19:26 4
Правильное сравнение чисел с плавающей точкой:

C++
1
2
  if (fabs(a-b) <= 1.0E-15) // для double
    ....
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
Изображения
 
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2012, 13:21 8
https://www.cyberforum.ru/blogs/18334/blog88.html
1
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
27.07.2012, 14:17 9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Также следует отметить, что машинное представление зачастую зависит от типа компилятора, думаю более старые компиляторы имели худшие в плане погрешности так сказать "пределы" для вещественных чисел.
float аппаратный.
0
0 / 0 / 0
Регистрация: 12.02.2011
Сообщений: 13
27.07.2012, 18:02  [ТС] 10
Всем большое спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2012, 18:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Длинная арифметика
Ребята,объясните как решить задачу , напишите хоть часть кода. Пусть даны числа a , b . Найти...

длнная арифметика
привет ,помогите создать класс длинная арифметика чез строки на си ,плиз...

Адресная арифметика
Почему не работает данная программа? По идее после применения постфиксного инкремента у меня в...

Адресная арифметика
Здравствуйте. Помогите мне понять такой вопрос. Есть указатель на первый элемент массива . Скажите...

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


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

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

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