![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 13.10.2020
Сообщений: 23
|
![]()
Всем привет. Возникла проблема при решении задачи на c++. При вычитании вещественных чисел, получаю не тот результат, который хотелось бы.
В общем возьмём код: Код:
Я хочу получить -0.000042. Я не понимаю, почему так происходит. Заранее спасибо! |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,714
|
![]()
Потому что таково машинное представление float. В привычной нам десятичной системе дроби - это 10-ки в отрицательной степени, в машинном представлении - это 2-ки в отрицательной степени. И это не всегда совпадает "точь-в-точь". Потому-то если сравнивать два float, которые по нашим сведениям, будут равны - комп может решить, что они не равны. И оттого при сравнении float чисел принято считать их равными, если абс. величина их разности меньше некоторой наперёд заданной величины.
Если уж требуется супер-пупер-гипер совсем дикая (совершенно не нужная) точность, можно применить double или даже long double . Но повторю: для абсолютного большинства практических расчётов точности float больше чем достаточно, надо только правильно с ними работать. К примеру, если мы суммируем большое количество чисел, резко отличающихся по величине - бо'льшую точность получим, если их предварительно отсортируем по возрастанию и начнём суммирование с наименьших. ----------------------- PS Если решать не на ++, а на Дельфи или Питоне - резульат будет приблизительно такой же с возможными небольшими вариациями. ![]() Последний раз редактировалось digitalis; 01.06.2022 в 11:15. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 13.10.2020
Сообщений: 23
|
![]()
digitalis, Выходит, с этим ничего не поделать? Тогда почему калькулятор на том же компьютере рисует нули, а компилятор срезает и переносит запятую?
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,830
|
![]()
Какой-то у вас компилятор фиговый, 0.0000416 дает... std::fixed вам поможет
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 13.10.2020
Сообщений: 23
|
![]()
p51x, MinGW. Вот и я грешу на компилятор
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,376
|
![]()
А что на него грешить? Вывод по умолчанию настроен на научную нотацию.
Если Вы желаете представить это число в другом формате, то читаем datasheet на операторы cin или cout для С++. Используем манипуляторы или флажки (что там ещё есть) и радуемся.
Как-то так, ...
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,714
|
![]()
Так это же - бесплюсово, отрыжка "чистого" Си.
![]() ИваннавИ калькулятор - это готовая законченная программа. В принципе, можно написать калькулятор, который даёт хоть сотню знаков после запятой, и как он это делает - нас не кусается. Но при этом он так и остаётся калькулятором, ничего другого не умеющим. Когда мы пишем прогу на ++ или любом другом - нам предоставляются практически неограниченные возможности, превышающие "штатные" возможности процессора. В мире идёт соревнованние (может, уже заглохло?) - кто больше даст точных знаков в числе Пи. Понятно, что достигнутый результат 1 241 100 000 000 десятичных знаков непосредственной ценности не имеет, но на пути к этому рекорду , наверное, совершенствовалась методика расчётов. В общем, надо принять как данность, что 3.0 * (1.0 / 3.0) не обязательно выдаст 1.000000... и этим фактом больше не заморачиваться. |
![]() |
![]() |
![]() |
#9 | |
фрилансер, препод.
Участник клуба
Регистрация: 11.10.2019
Сообщений: 1,044
|
![]()
ИваннавИ, а ещё забудь про float, используй double
Код:
Цитата:
|
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,714
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дан массив,состоящий 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 |