İçinde stdint.h(C99), boost / cstdint.hpp ve cstdint(C ++ 0 x) vardır başlıklar, diğerleri arasında, tip int32_t.
Benzer sabit boyutlu kayan nokta türleri var mı? Gibi bir şey float32_t?
İçinde stdint.h(C99), boost / cstdint.hpp ve cstdint(C ++ 0 x) vardır başlıklar, diğerleri arasında, tip int32_t.
Benzer sabit boyutlu kayan nokta türleri var mı? Gibi bir şey float32_t?
sizeofoperatörü kullanırsınız . Bunun gibi bir tür, bir algoritmanın bilinen belirli bir boyut olmasını gerektirdiğinde yararlı olacaktır.
sizeofSürekli olarak sıraya dizilen ve sıralı olmayan yüzen tipler sorununu çözmek için nasıl kullanılabilir?
Yanıtlar:
Şu anda C veya C ++ standartlarında böyle bir şey yoktur. Aslında, floatikili kayan nokta formatı olacağına dair bir garanti bile yoktur .
Bazı derleyiciler, floattürün IEEE-754 32 bit ikili format olacağını garanti eder . Bazıları yok. Gerçekte, çoğu gömülü olmayan platformda floatIEEE-754 singletürü olsa da, ifadeleri daha geniş bir formatta değerlendiren bazı derleyiciler hakkındaki olağan uyarılar geçerlidir.
IEEE-754'ün 2008 revizyonu için C dili bağlamaları eklemeyi tartışan ve böyle bir typedef'in eklenmesini önerebilecek bir çalışma grubu var. Bu C'ye eklendiyse, C ++ standardının eninde sonunda ... uyacağını umuyorum.
floatIEEE 32 bit türünüzün olup olmadığını öğrenmek istiyorsanız kontrol edin std::numeric_limits<float>::is_iec559. Bu bir derleme zamanı sabiti, bir fonksiyon değil.
Daha kurşun geçirmez olmak istiyorsanız std::numeric_limits<float>::digits, IEEE standardı çift hassasiyeti gizlice kullanmadıklarından emin olun float. 24 olmalı.
Söz konusu olduğunda long double, digitsmakul olarak olabilecek birkaç IEEE formatı olduğundan kontrol etmek daha önemlidir : 128 bit (rakam = 113) veya 80 bit (rakam = 64).
Böyle olması pratik olmaz float32_tçünkü eğer varsa, genellikle kayan nokta donanımı kullanmak ve bir yazılım uygulamasına geri dönmek istemezsiniz.
long doubleOS X (hem 32 bit hem de 64 bit Intel) üzerine biçimi tam olarak küçük endian sırayla saklanan IEEE-754 çift genişletilmiş biçimidir. Hiç de korkak bir şey yok. 0-7 baytları anlam alanını ve 8 ve 9 baytları üs ve işaret alanlarını tutar.
5.0Lbir anlamlılığı vardır a000000000000000. Tarafsız üssü +2'dir ve çift genişletilmiş üs eğilimi ise 3fff5.0L için yanlı üsdür 4001. Little-endian düzeninde depolandığında gerçek bayt kalıbı şudur 00 00 00 00 00 00 00 a0 01 40ve eğer bunu iki küçük endian 64-bit tam sayı olarak görürseniz, tam olarak ne gözlemlediğinizi görürsünüz.
4001Little- endian'da 01 40 00 00 ...başka bir şey yoksa, en az önemli olan bayt önce gelir. Dizinin a0 01 40sayı içinde bir yerde görünmesini bekliyorum (sadece bir rotasyon gerçekleştirmişlerse), ancak nedenini açıklamadığınızı a0ve 01 40tamamen ayrı yarılar olduğunu sanmıyorum .
Float32_t ve float64_t gibi typedef'lerin herhangi bir nedenle pratik olmadığını düşünüyorsanız, küçük yuvanızın dışına da bakamayacağınız için tanıdık işletim sisteminize, derleyiciye fazla alışmış olmalısınız.
32-bit IEEE kayan nokta işlemlerini ve 64-bit yapan diğerlerini yerel olarak çalıştıran donanım vardır. Bazen bu tür sistemler birbirleriyle konuşmak zorunda bile kalırlar, bu durumda her platformda bir çiftin 32 bit mi yoksa 64 bit mi olduğunu bilmek son derece önemlidir. 32 bitlik platform, diğerinin 64 bitlik değerlerine göre aşırı hesaplamalar yapacaksa, zamanlama ve hız gereksinimlerine bağlı olarak daha düşük hassasiyete çevirmek isteyebiliriz.
Benim platformumda tam olarak kaç bit olduğunu bilmediğim sürece, yüzer ve çiftler kullanmaktan kendimi rahatsız hissediyorum. Daha da fazlası, bunları bazı iletişim kanalları üzerinden başka bir platforma aktaracak olursam.
Şu anda aşağıdaki türleri dile eklemek için bir teklif var:
decimal32
decimal64
decimal128
bir gün erişilebilir olabilir #include <decimal>.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24Ayrıca 24 bit örnekleri daha kolay olan wav dosyalarını okuma gibi şeyleri yapmak için de!