double a = 0;
double b = -42;
double result = a * b;
cout << result;
a * b
sonucu -0
, ancak 0
bekleniyor. Nerede hata yaptım?Bu çift değer neden "-0" olarak yazdırıldı?
double a = 0;
double b = -42;
double result = a * b;
cout << result;
a * b
sonucu -0
, ancak 0
bekleniyor. Nerede hata yaptım?Bu çift değer neden "-0" olarak yazdırıldı?
bit temsil -0.0
ve 0.0
arasındafarklı, ancak bunlar çok -0.0==0.0
true
döneceğini, aynı değer bulunmaktadır. Sizin durumunuzda, result
-0.0
, çünkü işlenenlerden biri negatiftir.
bu demo izleyin:
#include <iostream>
#include <iomanip>
void print_bytes(char const *name, double d)
{
unsigned char *pd = reinterpret_cast<unsigned char*>(&d);
std::cout << name << " = " << std::setw(2) << d << " => ";
for(int i = 0 ; i < sizeof(d) ; ++i)
std::cout << std::setw(-3) << (unsigned)pd[i] << " ";
std::cout << std::endl;
}
#define print_bytes_of(a) print_bytes(#a, a)
int main()
{
double a = 0.0;
double b = -0.0;
std::cout << "Value comparison" << std::endl;
std::cout << "(a==b) => " << (a==b) <<std::endl;
std::cout << "(a!=b) => " << (a!=b) <<std::endl;
std::cout << "\nValue representation" << std::endl;
print_bytes_of(a);
print_bytes_of(b);
}
Çıkış ([email protected]): Kendini görebileceğiniz gibi
Value comparison
(a==b) => 1
(a!=b) => 0
Value representation
a = 0 => 0 0 0 0 0 0 0 0
b = -0 => 0 0 0 0 0 0 0 128
, -0.0
ait son bayt 0.0
ait son bayt farklıdır .
Bu yardımcı olur umarım.
http://en.wikipedia.org/wiki/IEEE_754#Formats "Sıfır değerleri, anlamlı ve sıfır olan sonlu değerlerdir. Bunlar sıfırdır, işaret biti sıfırın +0 (pozitif sıfır) veya −0 olduğunu belirtir. (negatif sıfır). " – TNW
Tnx, bana gerçekten yardımcı oldunuz. – hofmn
kayan nokta karşılaştırması '==' ve '! =' Güvensizdir. Bunu asla yapma. – Walter
0 == -0’e inanıyorum ki sorun yok. -0 kayan nokta bir sorundur. –
[İmzalı sıfırdaki wikipedia makalesi] (http://en.wikipedia.org/wiki/Negative_zero) okunmaya değer. – halex
Başlığı daha spesifik yapmak için düzenledim. –