float sayı sorunu

Başlatan saban88, 08 Ekim 2019, 17:29:44

saban88

STM32F407 işlemci ile aşağıda ki debug görüntüsünü verdiğim sorunla karşılaştım. Virgülden sonraki sayılara dikkat ederseniz hatayı anlayacaksınız. Daha önce karşılaşan var mı? Yardımlarınızı bekliyorum.



taydin

O gördüğün durum kayan noktalı sayıların özelliğidir. Reel sayıların çok büyük bir bölümünün eksiksiz bir kayan nokta eşdeğeri yoktur.

Mesela float 10'u float 3'e bölersen, sonucu da tekrar 3 ile çarparsan 10 elde etmezsin, ama 10'a çok yakın bir rakam elde edersin. Oradaki sapma senin işlemin sonucunu etkileyecek kadar önemli ise, "float" yerine "double" kullanabilirsin. Ama gene 10'u 3'e bölüp sonucu 3 ile çarparsan 10 elde etmezsin.
Timur Aydın (mekatronik.org)

OptimusPrime

#2
Marsa birseyler gondermiyorsan cokda sorun degil  :D

Degiskeni double olarak degitirebilirsin veya derleyicinin FPU yu kullanip kullanmadiginada bakabilirsin.

Simdi aklima geldi belki bunu IDE yorumlarken yanlis yorumluyordur.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

taydin

x86_64 mimarisinde GCC matematik kütüphanesi bütün işlemleri maksimum çözünürlükte yapar (double'dan daha iyi bir çözünürlük), sonra da çıkan sonucu, ilgili tip ile (float veya double) temsil edilebilen en yakın değere yuvarlar. O yüzden mesela ben şimdi masaüstü bilgisayarda basit bir C programı ile bunu denesem bu problemi görmem. Ama eğer kullanılan gömülü işlemcinin matematik kütüphanesi bu tarz bir yuvarlama yapmıyorsa böyle sapmalar hep olur.
Timur Aydın (mekatronik.org)

muuzoo

Bir ekleme yapayım, bu yüzden float sayılar ile karşılaştırma yaparken dikkatli olmak lazım özellikle "==" kontrolü için.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

mufitsozen

Alıntı yapılan: saban88 - 08 Ekim 2019, 17:29:44STM32F407 işlemci ile aşağıda ki debug görüntüsünü verdiğim sorunla karşılaştım. Virgülden sonraki sayılara dikkat ederseniz hatayı anlayacaksınız. Daha önce karşılaşan var mı? Yardımlarınızı bekliyorum.


Ahh nostalji!

Sene 1974 Fortran IV dersinde ikinci odevimizi hazirliyoruz, ODTUdeki IBM 360/40 bilgisayarda, Bu durumdan dolayi bir suru vakit kaybetmistik.

neden 0.1(onluk sistem) binary de sonsuz dizi gibi cikar ve (X/0.1)*0.1 niye hicbir zaman X'e esit olmuyor vs gormustuk.

45 sene gecmis ustunden! :)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

OptimusPrime

@saban88

https://ibb.co/jM816rH

senin islemci biraz dandikmis sanki hee  :D  :D
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Erol YILMAZ

floating kütüphanelerini karşılaştırmak lazım bununla...

foseydon

@saban88

hocam makine ondalıklı sayı bilmez, onun bildiği ikilik sistemdir. senin kullandığın ondalıklı sayılar aslında bir şekilde ikilik sistemde tutuluyor. bütün sayıları tutacak yer olmadığı için arada eksik kalan kısımlar var. olayın özü bu.

https://www.wikiwand.com/en/Single-precision_floating-point_format

burdan başla okumaya anlarsın mevzuyu.

OptimusPrime

@Erol YILMAZ
Bunu hw hesapladi sw degil.  ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

saban88

Alıntı yapılan: OptimusPrime - 10 Ekim 2019, 17:01:55@saban88

https://ibb.co/jM816rH

senin islemci biraz dandikmis sanki hee  :D  :D

stm32f4 den bahsediyoruz o kadarda olmas gerk. Arduinoda olmayan hata bunda oluyor.

saban88

bilgilerndirmeler için teşekkürler.Ben bu tarz sorunla karşılaşacağımı hiç tahmin etmezdim. Enteresan geldi. Çözüm denemelerimi sizlerle paylaşmak isterim.
-IDE değiştirdim truestudie dan keile geçtim birşey değişmedi.

-Float yerine double kullandım biraz daha yakın sonuç vermeye başladı.

-Forumlarda bu tarz sorunlarla karşılaşanların tartışmalarını okudum. Sorunun işlemci kaynaklı olduğu kanaatine vardım ama 32 bit m4 işlemcinin böyle bir sorun vereceğini hiç düşünmezdim.Daha önce pic de ve arduinoda hiç böyle birşeyle karşılaşmadım.

-Problem aslında ekran da bu sayıları göstermekti.Çünkü bir sayıyı kullanıcı 1.80 diye kaydettikten sonra sistem bunu ona 1.79 şeklinde gösteriyordu. Buda kullanıcı tarafından istenilmiyordu. Bende bunun için bir fonksiyon yazarak bir nevi kullanıcıya istediği şeyi gösterdim. :)

-Hesapta vereceği milyonda birlik hataya gelince zaten analog veri okuyup hesaplama yapacağı için analog verideki okuma hatasına oranla çok daha küçük bir hata olacağından kimse fark etmeyecektir diye düşünüyorum.

-fpu yu harware yada software yapmam birşeyi değiştirmedi.

OptimusPrime

Double dogrudan fpu yu devre disi birakir. Ben derleyicinin fpu yu kullandigini dusunmuyorum. Dogrudan asm yide kontrol edebilirsin emin olmak icin. Asagidaki linke de goz at derim.  ::ok

https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/10-useful-tips-to-using-the-floating-point-unit-on-the-arm-cortex--m4-processor
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

fahri-

Alıntı yapılan: saban88 - 11 Ekim 2019, 11:22:25Daha önce pic de ve arduinoda hiç böyle birşeyle karşılaşmadım.
Pic de hangi derleyici ile karşılaşmadınız merak ettim. CCS C derleyicede aynı olay var çünkü.