Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2022, 10:24   #1
ИваннавИ
Пользователь
 
Регистрация: 13.10.2020
Сообщений: 23
По умолчанию Вычитание вещественных чисел на c++.

Всем привет. Возникла проблема при решении задачи на c++. При вычитании вещественных чисел, получаю не тот результат, который хотелось бы.
В общем возьмём код:
Код:
#include<iostream>

int main()
{
    float n, k, result;
    n = 0.460393;
    k = 0.460435;
    result = n-k;
    std::cout<<"n: "<<n<<" "<<"k: "<<k<<" "<<"result: "<<result<<std::endl;
    return 0;
}
На выходе будет n: 0.460393 k: 460435 result: -4.16338e-005.
Я хочу получить -0.000042.
Я не понимаю, почему так происходит.
Заранее спасибо!
ИваннавИ вне форума Ответить с цитированием
Старый 01.06.2022, 10:57   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,714
По умолчанию

Потому что таково машинное представление float. В привычной нам десятичной системе дроби - это 10-ки в отрицательной степени, в машинном представлении - это 2-ки в отрицательной степени. И это не всегда совпадает "точь-в-точь". Потому-то если сравнивать два float, которые по нашим сведениям, будут равны - комп может решить, что они не равны. И оттого при сравнении float чисел принято считать их равными, если абс. величина их разности меньше некоторой наперёд заданной величины.
Если уж требуется супер-пупер-гипер совсем дикая (совершенно не нужная) точность, можно применить double или даже long double . Но повторю: для абсолютного большинства практических расчётов точности float больше чем достаточно, надо только правильно с ними работать. К примеру, если мы суммируем большое количество чисел, резко отличающихся по величине - бо'льшую точность получим, если их предварительно отсортируем по возрастанию и начнём суммирование с наименьших.
-----------------------
PS Если решать не на ++, а на Дельфи или Питоне - резульат будет приблизительно такой же с возможными небольшими вариациями.

Последний раз редактировалось digitalis; 01.06.2022 в 11:15.
digitalis вне форума Ответить с цитированием
Старый 01.06.2022, 11:40   #3
ИваннавИ
Пользователь
 
Регистрация: 13.10.2020
Сообщений: 23
По умолчанию

digitalis, Выходит, с этим ничего не поделать? Тогда почему калькулятор на том же компьютере рисует нули, а компилятор срезает и переносит запятую?
ИваннавИ вне форума Ответить с цитированием
Старый 01.06.2022, 11:50   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Какой-то у вас компилятор фиговый, 0.0000416 дает... std::fixed вам поможет
p51x вне форума Ответить с цитированием
Старый 01.06.2022, 12:28   #5
ИваннавИ
Пользователь
 
Регистрация: 13.10.2020
Сообщений: 23
По умолчанию

p51x, MinGW. Вот и я грешу на компилятор
ИваннавИ вне форума Ответить с цитированием
Старый 01.06.2022, 18:06   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,376
По умолчанию

А что на него грешить? Вывод по умолчанию настроен на научную нотацию.
Если Вы желаете представить это число в другом формате, то читаем datasheet на операторы cin или cout для С++. Используем манипуляторы или флажки (что там ещё есть) и радуемся.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 01.06.2022, 18:32   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

или по старинке
Код:
printf('n = %.9f; k = %.9f; result = %.9f', n, k, result);
macomics вне форума Ответить с цитированием
Старый 01.06.2022, 21:25   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,714
По умолчанию

Так это же - бесплюсово, отрыжка "чистого" Си.
ИваннавИ калькулятор - это готовая законченная программа. В принципе, можно написать калькулятор, который даёт хоть сотню знаков после запятой, и как он это делает - нас не кусается. Но при этом он так и остаётся калькулятором, ничего другого не умеющим.
Когда мы пишем прогу на ++ или любом другом - нам предоставляются практически неограниченные возможности, превышающие "штатные" возможности процессора. В мире идёт соревнованние (может, уже заглохло?) - кто больше даст точных знаков в числе Пи. Понятно, что достигнутый результат 1 241 100 000 000 десятичных знаков непосредственной ценности не имеет, но на пути к этому рекорду , наверное, совершенствовалась методика расчётов.
В общем, надо принять как данность, что 3.0 * (1.0 / 3.0) не обязательно выдаст 1.000000... и этим фактом больше не заморачиваться.
digitalis вне форума Ответить с цитированием
Старый 02.06.2022, 06:33   #9
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,044
По умолчанию

ИваннавИ, а ещё забудь про float, используй double
Код:
#include<iostream>
#include<iomanip>

int main()
{
    const double n = 0.460393;
    const double k = 0.460435;
    const double result = n-k;
    std::cout<<std::fixed<<"n: "<<n<<" "<<"k: "<<k<<" "<<"result: "<<result<<std::endl;
    return 0;
}
Цитата:
n: 0.460393 k: 0.460435 result: -0.000042
Алексей1153 вне форума Ответить с цитированием
Старый 02.06.2022, 11:21   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,714
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Код:
    const double result = n-k;
Пример не совсем корректный: result получаем на этапе компиляции, а не выполнения программы.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан массив,состоящий N (N>1) вещественных чисел. Найти среднеарифметическое значение чисел массива. nikola_orsha Паскаль, Turbo Pascal, PascalABC.NET 2 11.10.2016 13:05
Задана последовательность из n вещественных чисел. Определить количество чисел, попадающих в заданный интервал. без массивов. Квитокс Помощь студентам 5 05.12.2013 15:05
Дана последовательность из 100 вещественных чисел. Определить , со скольких чётных чисел она начинается SnS Lazarus, Free Pascal, CodeTyphon 2 22.09.2013 18:48
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Дано n вещественных чисел а1, а2,…,аn. Определите число соседств двух чисел разного знака (Паскаль) bambam Помощь студентам 1 29.11.2011 11:36