powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему так непонятно выводит нуль в MVS 2010?
12 сообщений из 12, страница 1 из 1
Почему так непонятно выводит нуль в MVS 2010?
    #38052027
drcosmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, заранее, за тупейший в истории планеты вопрос.

Есть детский код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include <iostream>
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian"); // Для вывода русской кириллицы
	int num_min,i,ib,ie,n;
	cout << "Введите число элементов массива: ";
	cin >> n;
	float min,*a = new float[n];
	cout << "Введите элементы массива: " << endl;
	for (i=1; i<=n; i++) cin >> a[i];

	float tmp=0;
	// Сначала нулевые элементы
	for (i=1; i<=n; i++) {
		if (a[i] == 0) {
			for (int j=i; j>0; j--) {
				tmp = a[j-1];
				a[j-1]=a[j];
				a[j]=tmp;
			}
		}
	}

    cout << "Нулевые элементы впереди:" << endl;
    for (i=1;i<=n;i++) cout << "a["<<i<<"] = "<<a[i]<<endl;
	system("Pause");
	return 0;
}



Выводит первыми нулевые элементы:

Введите число элементов массива: 4
Введите элементы массива:
0
1
0
4
Нулевые элементы впереди:
a[1] = 0
a[2] = -4.31602e+008 wtf ?!
a[3] = 1
a[4] = 4


Где затерялся этот мусор в переменной?

Или это связано со средой разработки?

Благодарю за подсказку!
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052028
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drcosmo,

В С и С++ индексы массива начинаются с 0, а не с 1, как на это рассчитывает ваш код.
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052033
drcosmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо! Что-то я тупанул :)
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052041
drcosmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а почему в таком случае...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <iostream>
 
using namespace std;
 
int main()
{
    for (double x = -1; x < 1; x += 0.2)
    {
        cout << x << endl;
    }
    system("Pause");
    return 0;
}



...выводит примерно тоже самое?

-1
-0.8
-0.6
-0.4
-0.2
-5.55112e-017
0.2
0.4
0.6
0.8
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052051
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drcosmo,
float это не точный тип данных. Либо работай с целыми числами и подрисовывай точку в нужном месте, либо смирись с погрешностью.
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052061
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой предыдущий ответ был просто указанием на явную проблему в коде, а не ответом почему код так работает.

А -5.55112e-017 - это такой артефакт форматов float/double.
Таких артефактов бывает несколько видов.

В данном случае - из-за того, что в С/С++ невозможно точное представление любых десятичных чисел с фиксированной точкой во внутренних форматах (float, double) - например таких чисел, где десятичное число представляется в двоичном коде как бесконечная дробь. При достаточно большом числе промежуточных операций ошибка в младших разрядах двоичного представления числа накапливается, но в десятичном представлении она не сразу видна (например у -0.2 в double есть несколько бинарных представлений)

Вам надо при отображении float/double всегда применять окруление до определенного числа знаков, так как в самых младших разрядах всегда возможен мусор.
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052105
drcosmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, огромное спасибо за разъяснение.

Теперь использую конструкцию cout << fixed << x << endl; и все прекрасно выводит!

Вопрос исчерпан!
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052527
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>
> Вам надо при отображении float/double всегда применять окруление до
> определенного числа знаков, так как в самых младших разрядах всегда возможен мусор.

0) это не мусор
1) никаких разрядов на самом деле нет.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38052576
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
>
> Вам надо при отображении float/double всегда применять окруление до
> определенного числа знаков, так как в самых младших разрядах всегда возможен мусор.

0) это не мусор
1) никаких разрядов на самом деле нет.


0) Это именно мусор, т.к. получен в результате операции над промежуточными данными хранящимися в двоичном виде с точностью превышающей точность входных десятичных данных.
1) Разряды есть у мантиссы. В частности у double гарантируется погрешность хранения не выше 15-го десятичного знака мантиссы, а у float - 7. А у соответствующих двоичных мантисс погрешность слегка меньше и эта разница принципиально неустранима - отсюда и всякие эффекты.
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38055084
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky0) Это именно мусор, т.к. получен в результате операции над промежуточными данными хранящимися в двоичном виде с точностью превышающей точность входных десятичных данных.


Тав вообще нет точности. Они неточные все по определению.

Anatoly Moskovsky1) Разряды есть у мантиссы. В частности у double гарантируется погрешность хранения не выше 15-го десятичного знака мантиссы, а у float - 7. А у соответствующих двоичных мантисс погрешность слегка меньше и эта разница принципиально неустранима - отсюда и всякие эффекты.


блин, как мне это всё надоело. Я в смысле -- вообще глобально.

Там нет вообще никаких гарантий.
У тебя число может быть рациональным (записываемым в виде конечной десятичной дроби)
и не быть рациональным в двоичной системе счисления (принципиально незаписываемым в виде конечной
двоичной дроби).

Там нет точности, погрешности. Всё неточно по определению.
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38055255
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТам нет точности, погрешности. Всё неточно по определению.
Вам бы метрологию подучить, заодно узнаете что неточность как раз и вводит понятие погрешности.
Погрешность это всего лишь максимальное отклонение между идеальным значением и его представлением. Ее не может не быть - в идеальном случае она равна нулю. В данном случае - float и double - она не равна нулю.
Для float и double (и других) в ieee 754 описаны конкретные форматы хранения и способы перевода из других представлений, из чего легко выводятся все погрешности, и это вполне конкретные значения, которые я выше приводил.

А если бы эти форматы были просто неточными, без каких либо гарантий меры неточности (погрешности) то 1) никакой практической разницы между float и double не было бы, 2) никто бы такими форматами не пользовался
...
Рейтинг: 0 / 0
Почему так непонятно выводит нуль в MVS 2010?
    #38055431
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, нам 100% надо это в FAQ добавлять.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему так непонятно выводит нуль в MVS 2010?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]