1. Assignment
Assignment işleminde range ve precision artışı olmaz. Açıklaması şöyle.
Elimizde şöyle bir kod olsun. Eğer x NaN değilse y == x her zaman true sonuç döner.
Assignment işleminde range ve precision artışı olmaz. Açıklaması şöyle.
ÖrnekExcept 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.
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
3. Cast[[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;}
Ö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
Ö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