1

AHDMathFlow Deneme Sorusu — Beklenmedik Sonuç!

Aşağıdaki Python kodu çalıştırıldığında çok garip bir sonuç veriyor.

import math

x = math.sqrt(2)
y = x * x - 2

print("Sonuç:", y)

Bir insan bu sonucu tahmin etmeye kalksa “0 çıkar” der. Çünkü:

2.2=2

22−2=0

Ama program çıktısı 0 değil, şu hatalı gibi görünen değeri verir:

Sonuç: 2.220446049250313e-16

python sayisal-analiz yaklasim
Bu soru Moderatör tarafından düzenlendi. (30.11.2025 17:39)

2 Cevap

1
Kabul Edilen Cevap

İlk başta bu kodu görünce sonuç 0 çıkar diye düşündüm, çünkü matematikte hep

$$\sqrt{2}^2 = 2$$

şeklinde biliyoruz. Ama Python’da görünüşe göre işler böyle çalışmıyor.

import math x = math.sqrt(2) y = x * x - 2 print(x) print(y) 


Buradaki temel sorun, bilgisayarların irrasyonel sayıları tam olarak saklayamaması. Mesela √2 sayısı:

$$\sqrt{2} = 1.41421356237\ldots$$

sonsuz basamaklı olduğu için bilgisayarda birebir tutulamıyor. Bu yüzden Python aslında tam √2 değil, ona çok yakın bir sayı kullanıyor.

Buna bağlı olarak:

$$x^2 = 2.000000000000000222\ldots$$

gibi küçük bir hata oluşuyor.

Bu olayın adı “floating point precision error” yani kayan nokta hassasiyet hatası. Bilgisayarlar IEEE 754 formatı yüzünden bazı sayıların tam karşılığını depolayamıyor. Bu nedenle böyle küçük farklar oluşuyor.

Eğer gerçekten tam sonuç isteseydik, şöyle bir şey kullanabilirdik:

from decimal import Decimal x = Decimal(2).sqrt() y = x * x - Decimal(2) print(y) 

Bu şekilde sonuç gerçekten 0 çıkıyor, çünkü Decimal sayıları çok daha hassas temsil ediyor.

Kısacası, burada matematik değil bilgisayar sınırlaması devreye giriyor. Başta garip gelse de mantığını öğrenince aslında oldukça normal bir durum.

0

Verdiğin açıklama genel olarak doğru; özellikle irrasyonel sayıların tam olarak temsil edilememesi konusunu doğru yakalamışsın. Burada daha netleştirilmesi gereken birkaç teknik nokta var.

Öncelikle, Python’daki davranış belirttiğin gibi irrasyonel sayılardan kaynaklanan bir problem değil; daha genel bir konu olan IEEE 754 double precision floating point temsilidir. Yani yalnızca √2 değil, ikilik sistemde tam karşılığı olmayan her sayı aynı etkiyi oluşturur.

Bu nedenle, işlem şu şekilde gerçekleşir:

1) math.sqrt(2) ifadesi gerçek sayının yalnızca 53 bitlik bir ikilik kesir yaklaşımını üretir.
2) Bu yaklaşım kendi içinde küçük bir hata taşır.
3) Dolayısıyla

x2≠2

tam olarak eşit değildir; çünkü x zaten gerçek √2 değildir, yalnızca en yakın olarak temsil edilebilen değerdir.

Bu hata rastlantı değil, sayının bellekteki temsil biçiminden doğan sistematik bir sonuçtur.

Dolayısıyla elde edilen:

2.220446049250313e-16

değeri aslında IEEE 754 standardında “machine epsilon” olarak bilinen değere çok yakındır. Bu epsilon, temsil edilebilecek en küçük relatif farktır ve hesaplamalarda sıkça karşımıza çıkar.

Bu nedenle programlama ortamlarında “gerçek sıfır” yerine “sıfıra yakınlık” kontrolü yapılır. Örneğin:

abs(y) < 1e-12

gibi bir karşılaştırma çok daha doğrudur.

Son olarak, belirttiğin gibi Decimal veya Fraction kullanarak bu tür hataları azaltmak mümkündür; ancak bunlar donanım seviyesinde desteklenmediği için performans maliyeti yüksektir. Bu nedenle bilimsel hesaplamalarda floating point hâlâ standart çözümdür.

Genel bağlamda cevabın doğru ve mantığı kavramışsın. Buradaki asıl amaç sayıları temsil ederken kullanılan sistemin matematiksel doğruluk ile tam örtüşmediğini göstermekti.

Düzenleyen: Moderatör (30.11.2025 17:28)

Cevap Yaz

Cevap yazmak için giriş yapmalısınız.