Float değişkeni Byte'lara bölme

Başlatan ehliseyf, 27 Temmuz 2016, 09:34:48

F493

Alıntı yapılan: JKramer - 28 Temmuz 2016, 14:01:02
Float da olsa hafızada byte byte tutulmuyor mu? Float sayı kaç byte ise doğrudan alınabilir, parçalayıp toplamaya gerek yok.

Ben float'ın özel bir yöntem ile memoride tutulduğunu biliyorum byte byte değil de.  https://en.wikipedia.org/wiki/Floating_point
Merakımdan soruyorum.

  Örneğin val diye bir değişken olsun ve 142.4568; şeklinde bir değeri tutsun.   

Ben bu değişkenden 142.45 degerini 142.45 olarak byte lara ayırmak istiyorum ve bu byte ları elde ettikten sonra yine 142.45 degerine tekrar geri dönmek istiyorum.

Bunu gösterirseniz bende boşuna uğraşmamış olacagım. :-).  Uygulamlı örnek ile gösterirseniz bende denemek isterim.

yamak

Alıntı yapılan: F493 - 28 Temmuz 2016, 14:41:21
Ben float'ın özel bir yöntem ile memoride tutulduğunu biliyorum byte byte değil de.  https://en.wikipedia.org/wiki/Floating_point
Merakımdan soruyorum.

  Örneğin val diye bir değişken olsun ve 142.4568; şeklinde bir değeri tutsun.   

Ben bu değişkenden 142.45 degerini 142.45 olarak byte lara ayırmak istiyorum ve bu byte ları elde ettikten sonra yine 142.45 degerine tekrar geri dönmek istiyorum.

Bunu gösterirseniz bende boşuna uğraşmamış olacagım. :-).  Uygulamlı örnek ile gösterirseniz bende denemek isterim.
Hocam float aslında bi yorumlanış şekli.Bellekteki datalar IEEE 754 göre hesaplanıp floating sayıya dönüştürülüyo.Yani data'yı herhangi bir şeye dönüştürdüğünüzde değişen bişey olmuyo.Ekrana bastırılacağı zaman float belleğin o bölgesindeki data IEEE754 e göre hesaplanıyo.Tabi sizin bahsettiğiniz şey sprintf ile ascii'ye çevirme.Bu durumun benim anlattığımla alakası yok.Örneğin:
142.45 sayısı bellekte 0x430E7333 olarak tutuluyo.

F493


Atasına inersek bit olarak tutulduğunu da buluruz sanırım. Sonuçta byte olarak tutulduğu kesin ama o byte ları bir araya getirdiğinizde anlamlı reel sayısı bulamayız başka verilerede ihtiyaç var. O nedenle bu byte lar onu ifade eden byte lar değil. O nedenle byte olarak tutulmuyor yani gerçek değer diyorum. O zaman bende sorarım NOKTA derede.   




mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

JKramer

Alıntı yapılan: F493 - 28 Temmuz 2016, 15:13:21
Atasına inersek bit olarak tutulduğunu da buluruz sanırım. Sonuçta byte olarak tutulduğu kesin ama o byte ları bir araya getirdiğinizde anlamlı reel sayısı bulamayız başka verilerede ihtiyaç var. O nedenle bu byte lar onu ifade eden byte lar değil. O nedenle byte olarak tutulmuyor yani gerçek değer diyorum. O zaman bende sorarım NOKTA derede.
Anlamlı reel sayı dediğiniz şeyi sizin hesaplamanıza gerek yok. yamak'ın dediği gibi, 142.45 sayısı bellekte 0x430E7333 olarak tutuluyormuş.  Siz float değişkenin adresinden bu 4 byte'ı sırayla alıp eeprom'a yazacaksınız. Daha sonra eeprom'dan sırayla alıp istediğiniz float değişkenin adresine yazacaksınız.

yamak

#20
Alıntı yapılan: F493 - 28 Temmuz 2016, 15:13:21
Atasına inersek bit olarak tutulduğunu da buluruz sanırım. Sonuçta byte olarak tutulduğu kesin ama o byte ları bir araya getirdiğinizde anlamlı reel sayısı bulamayız başka verilerede ihtiyaç var. O nedenle bu byte lar onu ifade eden byte lar değil. O nedenle byte olarak tutulmuyor yani gerçek değer diyorum. O zaman bende sorarım NOKTA derede.   
Hocam dedim ya;Başka veri dediğin IEEE 754 standartı.Yani 0x430E7333 datasını hangi makinada kullanırsanız kullanın IEEE 754'e göre sonuç 142.45 çıkar.

F493

Selam,

    Dediğiniz doğru ve kayıt işlemlerinde EEproma kaydedecegim değer  25.5'i geçmeyen değer olunca 1 byte olarak hafızada saklıyorum o nedenle bu yöntem işe yaramıyor. Yada 2 byte'lık bir değişken ise yine noktadan sonrası önemli oluyor ve bahsettiğim işlemleri yapmak kaçınılmaz oluyor.  Ama eeprom alanını 4 byte olarak ayırırsanız bu kullanılır. Yani 4 byte'ı her halükarda işleme sokmak gerekiyor eğer noktadan sonra basamak sayısı önemli ise. O zaman en başta önerilen yöntemlerde sorun kalmıyor. Ancak, hep 4 byte kayıt - okuma  işlemi yapılırsa. En başta sorduğum sorunun cevabını buldum.

mufitsozen

#22
Alıntı yapılan: kimlenbu - 28 Temmuz 2016, 10:21:50
Selamlar @mufitsozen hocam, "tehlikenin farkında mısınız" durumuna değinmeniz iyi oldu, kim bilir hafızada hangi bölgeyi değiştirecek, debug edene kadar insanın gözleri kör olur böyle bir durumda. Ben "index" 0,1,2,3 diye kendim belirttiğim için bir sorunla karşılaşmadım ama atıyorum döngü içinde kazara şu şekilde bir kullanım olursa dediğiniz tehlike ortaya çıkıyor

for (x=0;x<5;x++)
{
BYTE(degisken,x)=0;
}

---@mir_as82 yorumununu okuduktan sonra bu yazdigimi silmeye karar verdim
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Ama bu soruda sanki union u kontrollü kullanmak daha güzel bir çözüm gibi.(yani index in 3 ü aşması durumu için).

ehliseyf

Alıntı yapılan: mir_as82 - 29 Temmuz 2016, 08:16:20
Ama bu soruda sanki union u kontrollü kullanmak daha güzel bir çözüm gibi.(yani index in 3 ü aşması durumu için).
Hocam Micro C için union nasıl kullanılır. Daha iyi olacaksa ben onu kullanmayı öğrenmek isterim.
Code'm mu oturturum !

mir_as82


MCansız

örnek olarak;


struct    bytex
             {
              unsigned int bit_0 : 1;        // Byte 1, Bit 0
              unsigned int bit_1 : 1;        // Byte 1, Bit 1
              unsigned int bit_2 : 1;        // Byte 1, Bit 2
              unsigned int bit_3 : 1;        // Byte 1, Bit 3
              unsigned int bit_4 : 1;        // Byte 1, Bit 4
              unsigned int bit_5 : 1;        // Byte 1, Bit 5
              unsigned int bit_6 : 1;        // Byte 1, Bit 6
              unsigned int bit_7 : 1;        // Byte 1, Bit 7
              unsigned int bit_8 : 1;        // Byte 0, Bit 0
              unsigned int bit_9 : 1;        // Byte 0, Bit 1
              unsigned int bit_10: 1;        // Byte 0, Bit 2
              unsigned int bit_11: 1;        // Byte 0, Bit 3
              unsigned int bit_12: 1;        // Byte 0, Bit 4
              unsigned int bit_13: 1;        // Byte 0, Bit 5
              unsigned int bit_14: 1;        // Byte 0, Bit 6
              unsigned int bit_15: 1;        // Byte 0, Bit 7
           };

union
{
struct  bytex byte;
char low_higt[2];
int all;
}gpiox;



kullanımı


gpiox altında all isminde int tipi değişkenimiz var bu değişkenin
gpiox.low_higt[0]=> low nibble (ilk 8 bit)
gpiox.low_higt[1]=> high nibble (son 8 bit)   olur.
gpiox.byte.bit_15  all değişkenini 15. bitini gösterir ve değiştirebilirsiniz.


örnek:
gpiox.low_higt[0]=0x1F;
gpiox.low_higt[1]=0x2A;

değerleri verilirse
gpiox.all=0x2A1F   olur