Gözlemlediğiniz "sorun", çok doğa kayan nokta aritmetiğinden kaynaklanmaktadır.
FP'de hassasiyet, ölçeğe göre değişir; 1.0
değeri etrafında 1.0
ve 1.0+min_representable
arasındaki farkı ayırt edebilmek için yeterli değildir, burada min_representable
sıfırdan daha büyük olası en küçük değerdir (sadece en küçük normalleştirilmiş sayıyı, std::numeric_limits<float>::min()
'u dikkate alsak bile, en küçük denormal büyüklük birkaç mertebedir.) daha küçük.
çift hassasiyetli 64 bit IEEE-754 kayan nokta sayıları ile Örneğin, x=10000000000000000
ölçeğinde (10) etrafında bu x
ve x+1
ayırt etmek mümkün değildir.
ondalık nokta "yüzen" çünkü skala ile çözünürlüklü değişiklikleri, adı "kayan nokta" için çok nedeni olması. Bunun yerine sabit bir nokta gösterimi sabit bir çözünürlüğe sahip olacaktır (örneğin, 1/65536 ~ 0.00001 arasında bir hassasiyete sahip birimlerin 16 ikili rakamı ile).
küçük değeri: IEEE-754 32-bit kayan nokta biçiminde Örneğin
işareti bir bit, üs için 8 bit ve mantis için 31 bit orada eps
, 1.0f + eps != 1.0f
FLT_EPSILON
veya std::numeric_limits<float>::epsilon
olarak önceden tanımlanmış bir sabit olarak kullanılabilir. Ayrıca, epsilon'un yuvarlama hatalarıyla nasıl ilişkili olduğunu ele alan machine epsilon on Wikipedia'a da bakınız.
I.I.I.e. epsilon, burada beklediğinizi yapan ve 1.0'a eklendiğinde fark yaratan en küçük değerdir.
Bunun daha genel sürümü (1.0 dışındaki numaralar için) son yerde (mantissa) 1 birim olarak adlandırılır. Wikipedia'nın ULP article.
Neden şaşırdınız? Min ekliyorsunuz, epsilon değil. –
Fark olduğunu fark etmemiştim! Her zaman eşdeğer olduklarını varsaymıştım. Teşekkürler, bu yardımcı oldu. – Squidy
@Matteo Yanıt? Bu soru için gerçekten bir nedenim yok. –