Унарный оператор- () на нулевые значения - c ++ - PullRequest
4 голосов
/ 07 октября 2010

Я написал этот код для перегрузки унарного оператора на матричном классе:

const RegMatrix RegMatrix::operator-()const{
    RegMatrix result(numRow,numCol);
    int i,j;
    for(i=0;i<numRow;++i)
        for(j=0;j<numCol;++j){
            result.setElement(i,j,(-_matrix[i][j]));
        }

        return result;
}

Когда я запустил свою программу с отладчиком в Visual Studio, он показал мне, что когда операция выполняется на двойнойравный нулю, он вставляет в матрицу результата число -0,00000.Это какая-то странная особенность VS-дисплея, или я должен осторожно обращаться с ней?

Ответы [ 5 ]

4 голосов
/ 07 октября 2010

Подписанный ноль - ноль со связанным знаком.В обычной арифметике −0 = +0 = 0. Однако в вычислениях некоторые числовые представления допускают существование двух нулей, часто обозначаемых как -0 (отрицательный ноль) и +0 (положительный ноль).Это происходит в некоторых представлениях чисел со знаком для целых чисел и в большинстве представлений чисел с плавающей точкой.Число 0 обычно кодируется как +0, однако оно может быть представлено либо +0, либо -0.

Стандарт IEEE 754 для арифметики с плавающей точкой (в настоящее время используется большинством компьютеров и языков программирования, поддерживающих плавающую точкучисла) требует как +0, так и -0.Нули можно рассматривать как вариант расширенной строки действительных чисел, такой что 1 / −0 = −∞ и 1 / + 0 = + ∞, деление на ноль не определено только для ± 0 / ± 0.

Отрицательный ноль повторяет концепцию математического анализа приближения 0 снизу как одностороннего предела, который можно обозначить через x → 0−, x → 0− или x → ↑ 0.Обозначение «-0» может использоваться неофициально для обозначения небольшого отрицательного числа, которое было округлено до нуля.Концепция отрицательного нуля также имеет некоторые теоретические применения в статистической механике и других дисциплинах.

Утверждается, что включение нуля со знаком в IEEE 754 значительно упрощает достижение численной точности в некоторых критических задачах 1 в частности, при вычислениях со сложными элементарными функциями. [2]С другой стороны, концепция подписанного нуля противоречит общему предположению, сделанному в большинстве математических областей (и в большинстве курсов по математике), что отрицательный ноль - это то же самое, что и ноль.Представления, которые допускают отрицательный ноль, могут быть источником ошибок в программах, поскольку разработчики программного обеспечения не осознают (или могут забыть), что, хотя два нулевых представления ведут себя как равные при числовых сравнениях, они представляют собой разные битовые комбинации и в некоторыхоперации.

Для получения дополнительной информации см. Подписанный ноль вики-страница.

2 голосов
/ 07 октября 2010

с использованием двойного ( IEEE754 ), есть положительный и отрицательный ноль.

0 голосов
/ 07 октября 2010

-0 и 0 - это одно и то же, и беспокоиться не о чем.Числа с плавающей точкой могут иметь как положительный, так и отрицательный 0 по математическим соображениям.Но -0 интерпретируется так же, как 0 в арифметике C / C ++.

0 голосов
/ 07 октября 2010

Как и прежде, у вас есть отрицательный ноль:

#include <stdio.h>
int main()
{
    printf("%f\n", -0.0);
}
0 голосов
/ 07 октября 2010

Ну, для двойников фактически есть разные значения для '0.0' и '-0.0'. Я думаю, что это имеет смысл ....

Какой другой результат вы ожидали?

...