ARM ve Ondalık Sayılar

Başlatan flowchartx, 30 Eylül 2022, 08:39:10

flowchartx

Herkese günaydın. Float bir değişkenimi timer içerisinde 0.2 olarak arttırıp azaltırıyorum fakat +0.2 olduğu zaman
1.20000002
1.40000004
1.60000006
1.80000008
2.00000000
olarak değerleri alıyorum fakat arttırma miktarımı 0.25 olarak ayarladığım zaman hiç bir sorun olmuyor. Normalde bir sorunum olmaz bu kadar ufak bir hatayla ama başka bir float sayıya eşitliğini kontrol ettiğim için koşulu doğrulamıyo ve program yanlış çalışıyor.

quarko

0.25, 2^(-2) olarak ifade edilebildiğinden hata olmaz zaten. Tam olarak ifade edilemeyen değerlerde bir miktar hata olacaktır. Değişkenleri float değilde double yaparsanız hata miktarı azalır. Yada karşılaştırma yaparken, bir aralık içinde karşılaştırın, daha iyi olur.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

ex_machina


flowchartx


94onur94

Floating pointleri doğrudan karşılaştırmayın. Float sayı ramde tutulurken hexe çevirilir (IEEE-754). Örneğin 1.2 sayısı ramde 0x3f99999a olarak tutulur ama 1.20000001, 1.20000002, 1.20000003, 1.20000004, ...... 1.20000009 sayılarıda 0x3f99999a olarak tutulur. Tutulan hex tekrar floata dönüştürüldüğünde son hanelerde hata olabilir. Bu yüzden karşılaştırma ifadeniz false döndürür. Resimdeki gibi farkını alarak karşılaştırmak doğru sonuç verir.



berat23

bu rakamlarla single işlem yapamazsınız, doğrusu için double 64 bit olmalı.

double da olsa float sayılarla işlem yaparken çok digit farkı olması hataya oldukça açık.

Tagli

Özellikle double desteği olan bir işlemci söz konusu değilse (sanırım M7'lerde var) double değişkenler işlemciyi ağlatır... STM32F3 ve F4'lerde donanımsal float desteği var. Bu cihazlarda float yerine double kullanmak çok ciddi performans kaybına neden olur.
Gökçe Tağlıoğlu