Merhaba. Buradaki konunun bağlamına pek vakıf olamadım. Yine de yazıyı okurken kabaca böyle bir şey denesem ne olur diye merak ettim…
>>> a = (-1)**(1/2)
>>> b = (-1)**(1/2)
>>> a == b
True
Mantık olarak anlattığınız şey doğru görünüyor ama üstteki örnek en azından Python’da bunu yanlışlamış oldu bence.
Çünkü teknik olarak a da b de varlar. Python iki ifadeyi de complex() veri tipiyle sınıflandırıyor.
>>> a = (-1)**(1/2)
>>> print(a)
(6.123233995736766e-17+1j)
>>> type(a)
<class 'complex'>
Merhaba örneği 2 reel sayıyı karşılaştırmak bağlamında verdiğimi özellikle belirtmiştim. √−2 sayısını seçmemin sebebi zaten buydu.
Tabiki de kompleks sayılar için geçerli olabilir.
cmath.sqrt(-2) == cmath.sqrt(-2) // true
Real sayı bağlamında bakarsak
math.sqrt(-2) == math.sqrt(-2) veya
cmath.sqrt(-2) == math.sqrt(-2) // mümkün değil.
1 Beğeni
Kayan noktalı sayıları karşılaştırırken dikkat etmek gerekiyor. 0.1 + 0.2 == 0.3 gibi bir karşılaştırma yapmamak gerekiyor.
from decimal import Decimal
print(Decimal(0.1 + 0.2) == Decimal(0.3)) # False
Ama şöyle kullansaydık, karşılaştırmayı düzgün bir şekilde yapabilirdik.
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2") == Decimal("0.3")) # True
Kayan noktalı sayıları karşılaştırmak için math kütüphanesindeki isclose fonksiyonu kullanılabilir.
from math import isclose
print(isclose(0.1 + 0.2, 0.3)) # True
Ayrıca fractions kütüphanesindeki Fraction sınıfı da kullanılabilir:
from fractions import Fraction
print(Fraction(1, 10) + Fraction(2, 10) == Fraction(3, 10)) # True
merhaba;
güzel bir örnek.
Decimal(0.1 + 0.2) == Decimal(0.3)
bilgisayar ilk float tipindi 2 lik tabana cevirmeye calisiyor. Ama tam çeviremediği için ortaya bu sekil birşey çıkıyor sanırsam
0.1₁₀
= 0.00011001100110011001100110011001100110011...₂
= 2⁻⁴ + 2⁻⁵ + 2⁻⁸ + 2⁻⁹ + 2⁻¹² + 2⁻¹³ + 2⁻¹⁶ + 2⁻¹⁷ + ...
≈ 0.10000000000000000555111512312578₁₀
0.2₁₀
= 0.00110011001100110011001100110011001100110...₂
= 2⁻³ + 2⁻⁴ + 2⁻⁷ + 2⁻⁸ + 2⁻¹¹ + 2⁻¹² + 2⁻¹⁵ + 2⁻¹⁶ + ...
≈ 0.20000000000000001110223024625156₁₀
0.00011001100110011...₂
+0.00110011001100110...₂
────────────────────────
=0.01001100110011001101...₂ (≈ 0.3 ama tam değil)
bunu eşit kabul etmiyorken string’i kabul etmesi gerçekten ilginç geldi. Sebebi nedir acaba
"0.1" başı sonu belli olan bir karakter dizisi olduğu için matematiksel işlemler daha güvenli tanımlanabilir. Öte yandan 0.1 ise 0.1000000000000000055511151231257827021181583404541015625 gibi bir sayı ile temsil ediliyor -IEEE-754 standardından ötürü.
1 Beğeni