2 Haziran 2020 Salı

IEEE 754 Özel Sayılar

Özel Sayılar
IEEE 754 standardıyla çalışırken bir şekilde özel sayılar ile karşılaşılır. Bunlar infinity, NaN ve sıfırdır.

NaN
NaN yazısına taşıdım

Infinity
Infinity maksimum exponent ve sıfır olan bir mantissa olarak temsil edilir

Niçin bilmiyorum ama infinity sayısı pozitif veya negatif olarak tanımlanabiliyor. Dolayısıyla infinity sayısı bir başka infinity sayısı ile == , < , > işlemine göre karşılaştırılabilir.
double a = Double.POSITIVE_INFINITY;
double b = Double.POSITIVE_INFINITY;
System.out.println(a == b); // true
System.out.println(a < b); //  false
System.out.println(a > b); //  false
1. Programlama Dillerinde Infinity
C++
Sonsuzu temsil etmek için şu kullanılır.
std::numeric_limits<double>::infinity();
float için infinity şu sayıya eşittir.
const int 0x7f800000

2. Infinity Kontrolü
Bir sayının sonsuz olup olmadığı şöyle kontrol edilebilir.
public unsafe static bool IsInfinity(double d) 
{
    return (*(long*)(&d) & 0x7FFFFFFFFFFFFFFF) == 0x7FF0000000000000;
}
std::isinf - C++11
Bu metod bir sayının sonsuz olup olmadığını öğrenmek için kullanılır. Şöyle yaparız.
if(std::isinf(x))
{
  if(x>0)
    x = std::numeric_limits<double>::max();
  else
    x = -std::numeric_limits<double>::max();
}

Sıfır
Sıfır minimum exponent ile temsil edilir. Yani exponent'in tüm bitleri 0'dır. 

1. Artı veya Eksi Sıfır
Artı veya Eksi Sıfını Niye var sorusunun cevabı şöyle
In IEEE arithmetic, it is natural to define log 0 = -∞ and log x to be a NaN when x < 0. Suppose that x represents a small negative number that has underflowed to zero. Thanks to signed zero, x will be negative, so log can return a NaN. However, if there were no signed zero, the log function could not distinguish an underflowed negative number from 0, and would therefore have to return -∞.
Sayının eksi sıfır veya artı sıfır olduğunu anlamak için genel bir çözüm olarak aşağıdaki gibi yaparız
if (1 / x > 0)
  // +0 here
else
  // -0 here
Java
Sayının başındaki bite bakılabilir. Şöyle yaparız
float f = -0.0f;

if (Float.floatToIntBits(f) == 0x80000000) {
  System.out.println("Negative zero");
}
2. Artı veya Eksi Sıfır Karşılaştırması
Sıfır artı veya eksi de olsa herhangi bir sıfır ile karşılatırılırsa sonuç true döner.
Örnek
Şöyle yaparız.
float f = -0.0;

std::cout<<"==== > " << f <<std::endl<<std::endl;

if(f == -0.0f)
{
  std::cout<<"true"<<std::endl;
}
else
{
  std::cout<<"false"<<std::endl;
}
Çıktı olarak şunu alırız.
==== > -0  // Here print negative zero

true
Örnek
Elimizde şöyle bir kod olsun
float id1(float x) {
    return x + 0;
}
id1(-0.f) == -0.f şeklinde çağırırsak metod çağrısı 0.f dönmesine rağmen karşılaştırma sonucunu true olarak alırız

2. Artı ve Eksi Sıfırın Toplanması
Açıklaması şöyle.
IEEE 754 floating-point numbers have two zero values, one negative, one positive. When added together, the result is the positive one.
Örnek
Elimizde şöyle bir kod olsun
float id1(float x) {
    return x + 0;
}
id1(-0.f) şeklinde çağırırsak sonucu 0.f olarak alırız

Hiç yorum yok:

Yorum Gönder