14 Ocak 2020 Salı

IEEE754 - Float

1. Assignment
Assignment işleminde range ve precision artışı olmaz. Açıklaması şöyle.
Except for assignment and cast (which remove all extra range and precision), the values of operations with floating operands and values subject to the usual arithmetic conversions and of floating constants are evaluated to a format whose range and precision may be greater than required by the type.
Örnek
Elimizde şöyle bir kod olsun. Eğer x NaN değilse y == x her zaman true sonuç döner.
float x = ...

float y = x;

assert(y == x)
3. Integer'a Cast
Örnek
Anladığım kadarıyla undefined behavior vermeyen sadece iki tane yöntem var. Şöyle yaparız. reinterpret_cast, static_cast gibi yöntemler doğru değil
[[nodiscard]] constexpr float int_to_float4(int x) noexcept
{
  return std::bit_cast<float>(x);
}

[[nodiscard]] float int_to_float5(int x) noexcept
{
  float destination;
  memcpy(&destination, &x, sizeof(x));
  return destination;
}
3. Cast
Örnek
Elimizde şöyle bir kod olsun.
long l=9223372036854775807L;
float f=static_cast<float>(l);
Bu işlem sonucunda elimize geçen float değerin ne olacağı std::fesetround() metodu ile atanan "rounding mode" ile belirleniyor. IEEE754 5 tane "rounding mode" tanımlıyor. Bunlar şöyle.
Rounding-direction attributes to nearest
1. roundTiesToEven
2. roundTiesToAway

Directed rounding attributes
1. roundTowardPositive
2. roundTowardNegative
3. roundTowardZero

4. Karşılaştırma
double ve float karşılaştırması doğru sonuç vermeyebilir.

Örnek
Şöyle yaparız ve sonuç olarak "no" alırız.
#include<iostream.h>
using namespace std;
int main()
{
  float x=1.1;
  if(x==1.1)
    cout<<"yes";
  else
    cout<<"no";
  return 0;
}

Hiç yorum yok:

Yorum Gönder