2010-10-07 3 views
4

Я написал этот код, чтобы перегружать унарные operator- на классе матрицы:Унарное operator-() нулевые значения - C++

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-дисплея, или это то, над чем я должен обращаться осторожно?

+2

Это должно помочь: http://en.wikipedia.org/wiki/Signed_zero – ereOn

+0

Они по-прежнему сравнивают их, не так ли? –

ответ

4

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

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

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

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

Дополнительную информацию см. На странице Signed Zero wiki.

2

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

0

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

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

0

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

#include <stdio.h> 
int main() 
{ 
    printf("%f\n", -0.0); 
} 
-1

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

+0

Я не думаю, что это специально для C/C++, но для используемого FPU (или для библиотеки эмуляции IEEE754) –

+0

Не правда. См. Http://en.wikipedia.org/wiki/IEEE_floating-point_standard. – nothrow

Смежные вопросы