Evet arkadaşlar, modern C++ ile gelen kabiliyetlere göz atmaya devam ediyoruz. Bu yazımda da, kısaca C++ 17 ile gelen bir kabiliyetten bahsedeceğim:Onaltılı kayan noktalı (floating) sayı sabitleri.
Normalde tam sayılar için C ve C++ da onaltılı düzende sabitler tanımlanabilse de, kayan noktalı sayılar için böyle bir kabliyet yoktu, c++ 17 ile birlikte artık var.
Hemen bu sayıların nasıl tanımlanabileceğine bakalım:
“0x<Onaltılık Tamsayı Kısmı>.<Onaltılık kesirli kısmı>p<İkinin kaçıncı kuvveti olduğu>”
şeklinde tanımlanabilmektedir. Exponent p kısmı bu sabitler için her zaman eklenmelidir. Noktan önce 16 ve katları sonrasında ise 1/16 ve katları olarak sayı hesaplanıp, en son p ye göre, bütün sayı çarpılarak sabit elde edilmekte. Hemen örnekler üzerinden gidelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> int main() { std::cout << "\"0x0p0\" : " << 0x0p0 << "\n"; // ( 0.0 + 0.0/16 )*(2 uzeri 0) std::cout << "\"0x0.p0\" : " << 0x0.p0 << "\n"; // ( 0.0 + 0.0/16 )*(2 uzeri 0) std::cout << "\"0x.1p0\" : " << 0x.1p0 << "\n"; // ( 0.0 + 1.0/16 )*(2 uzeri 0) std::cout << "\"0x0.1p0\" : " << 0x0.1p0 << "\n"; // ( 0.0 + 1.0/16 )*(2 uzeri 0) std::cout << "\"0x1.1p0\" : " << 0x1.1p0 << "\n"; // ( 1.0 + 1.0/16 )*(2 uzeri 0) std::cout << "\"0x1.2p0\" : " << 0x1.2p0 << "\n"; // ( 1.0 + 2.0/16 )*(2 uzeri 0) std::cout << "\"0x2.2p0\" : " << 0x2.2p0 << "\n"; // ( 2.0 + 2.0/16 )*(2 uzeri 0) std::cout << "\"0x2.2p1\" : " << 0x2.2p1 << "\n"; // ( 2.0 + 2.0/16 )*(2 uzeri 1) std::cout << "\"0x2.2p2\" : " << 0x2.2p2 << "\n"; // ( 2.0 + 2.0/16 )*(2 uzeri 2) std::cout << "\"0x10.01p0\": " << 0x10.01p0 << "\n"; // (16.0 + 1.0/(16 uzeri 2))*(2 uzeri 0) std::cout << "\"0x10.01p1\": " << 0x10.01p1 << "\n"; // (16.0 + 1.0/(16 uzeri 2))*(2 uzeri 1) std::cout << "\"0x10.01p-1\": " << 0x10.01p-1 << "\n"; // (16.0 + 1.0/(16 uzeri 2))*(2 uzeri -1). Buna dikkat carptigimiz sayi 0.5 oluyor. yani 1/2 std::cout << "\"0x0.001p0\": " << 0x0.001p0 << "\n"; // (16.0 + 1.0/(16 uzeri 3))*(2 uzeri 0) return 0; } |
Yukarıdaki örnek kodun çıktısı da aşağıdaki gibi olacaktır:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"0x0p0" : 0 "0x0.p0" : 0 "0x.1p0" : 0.0625 "0x0.1p0" : 0.0625 "0x1.1p0" : 1.0625 "0x1.2p0" : 1.125 "0x2.2p0" : 2.125 "0x2.2p1" : 4.25 "0x2.2p2" : 8.5 "0x10.01p0": 16.0039 "0x10.01p1": 32.0078 "0x10.01p-1": 8.00195 "0x0.001p0": 0.000244141 |