1 Şubat 2019 Cuma

std::fmod - bölme sonucunda kalanı bulma

Giriş
Metodun imzası şöyle. x/y = z işleminde x bölünen, y bölen, z bölümdür. fmod z değerini değil kalanı verir.
#include <math.h>

double fmod(double x, double y);
float fmodf(float x, float y);
long double fmodl(long double x, long double y);
Açıklaması şöyle.
The floating-point remainder of the division operation x/y calculated by this function is exactly the value x - n*y, where n is x/y with its fractional part truncated.

The returned value has the same sign as x and is less than y in magnitude.
Bu yazıyla ilgili olarak std::modulus yazısına da bakılabilir.

Neden std::fmod Gerekir
Normalde "modulus operatorünün" sağ tarafına bir tam sayının gelmesi gerekir. Eğer gelmezse derleyici aşağıdaki gibi bir hata verir. Yani şu kod için
int main() {
  double x = 6.3;
  double y = 2;
  double z = x % y;
}
Şöyle bir hata alırız.
error: invalid operands of types 'double' and 'double' to binary 'operator%'
Bu durumda fmod metodunu kullamak gerekir. "Modulus operatöründen" farklı olarak double bir değer döndürüyor.

Örnek
Elimizde şöyle bir kod olsun.
std::fmod(+5.1, +3.0) = 2.1
Açıklaması şöyle.
when x = +5.1 and y = +3.0,  x/y (5.1/3.0 = 1.7) with its fractional part truncated is 1. So n is 1. So the fmod will yield x - 1*y which is 5.1 - 1 * 3.0 which is 5.1 - 3.0 which is 2.1.
Örnek
Şöyle yaparız.
double a=fmod(4.1,1.0);
cerr<<std::setprecision(0)<<a<<"\n";
cerr<<std::setprecision(10)<<a<<"\n";
cerr<<std::setprecision(20)<<a<<"\n";
Çıktı olarak şunu alırız.
0.1
0.1
0.099999999999999644729
Örnek
Şöyle yaparız.
cout << "fmod of 5.3 / 2.0 is " << fmod (5.3,2) << endl;
Eksi Sonuç
fmod eksi sayı verebilir. Örneğin fmod (-3,4) = -3 verir. Modulus operatörü de eksi bir sayı döndürebilir. Dolayısıyla modulus operatörü ile sayının eksi veya artık olmasına bakmadan tek/çift olduğunu kontrol etmek için aşağıdaki gibi yapılabilir.
public static boolean isOdd(int i) {
   return i % 2 != 0;
}

Hiç yorum yok:

Yorum Gönder