Как мне предотвратить или справиться со значениями -0? - PullRequest
0 голосов
/ 01 февраля 2010

Кажется, что моя программа производит значения -0 вместо значений, которые должны быть 0. Как мне остановить мою программу от вывода этих значений?

Это так же просто, как проверить, равно ли значение -0, и вместо этого переназначить его на ноль? Или есть более элегантное решение?

Ответы [ 3 ]

1 голос
/ 01 февраля 2010

Поскольку тег говорит о Visual-C ++, кажется, что вы работаете в Windows на Intel или совместимом чипе, поэтому целочисленные значения -0 невозможны. Возможно, у вас есть значение с плавающей запятой, которое отрицательно, но очень близко к 0, например -0.000000000000009, и, возможно, вы печатаете его с точностью до нескольких цифр, например -0.00000. В этом случае вы можете сделать что-то вроде:

if (x > -0.0000001 && x <= 0) x = 0;

Конечно, вы хотите сделать это более стильно, но это дает вам представление.

В основном тексте вашего вопроса не написано Visual C ++, Windows или Intel. Если вы работаете на одном компьютере, возможны целочисленные значения -0. Обычно -0 сравнивается равным +0, поэтому следующий код нормализует целые нули:

if (y == 0) y = 0;  // This looks redundant but it turns a -0 into a +0
1 голос
/ 01 февраля 2010

http://en.wikipedia.org/wiki/Signed_zero говорит: Согласно стандарту IEEE 754 отрицательный ноль и положительный ноль должны сравниваться как равные с обычными (числовыми) операторами сравнения.

Я бы исследовал, могут ли переменные быть преобразованы в 32-битное целое (для числа с плавающей запятой) или 64-битное целое число (для двойного числа) и посмотреть, равны ли они 0x8000 ...

0 голосов
/ 01 февраля 2010

Похоже, вы используете плавающие числа. Фактически -0 должно быть очень маленьким отрицательным числом, например -0.0000001, которое было усечено вашей функцией печати. Вы можете проверить это с помощью хорошего отладчика или распечатать необработанные числа с плавающей запятой / double в шестнадцатеричных байтах.

Вы можете сравнить и установить его на ноль. (например, если (n <0 && n> -0,0001) n = 0;)

(редактировать) Может быть, вы делаете такие вещи:

#include <stdio.h>
#include <float.h>
#include <iostream>

int main()
{
    double d = -DBL_MIN;
    std::cout << std::fixed << d << std::endl;
    return 0;
}

// output: -0.000000

Может быть, вы можете попытаться распечатать реальное значение внутри вашего числа с плавающей запятой / double. То есть

cout << *(__int64)&d; // if d is double
cout << *(__int)&f;   // if f is float

Печать, которая помогает понять, что произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...